guava本地緩存CacheLoader使用-創(chuàng)新互聯(lián)

最近代碼里看到有部分關(guān)于guava寫本地緩存的,學(xué)習(xí)記錄一下。

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供浦城網(wǎng)站建設(shè)、浦城做網(wǎng)站、浦城網(wǎng)站設(shè)計(jì)、浦城網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、浦城企業(yè)網(wǎng)站模板建站服務(wù),十載浦城做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

首先guava的本地緩存可以理解成一個(gè)緩存map,以kv的形式存數(shù)據(jù),不會(huì)持久化,沒(méi)有支持分布式。比redis使用起來(lái)方便,不用引入額外的組件。如果是單機(jī)緩存的話,可以首先選擇使用這種緩存方式。

Guava cache的設(shè)計(jì)來(lái)源于CurrentHashMap,是線程安全的,可以按照多種策略來(lái)清理存儲(chǔ)在其中的緩存值且保持很高的并發(fā)讀寫性能。常見(jiàn)應(yīng)用場(chǎng)景:對(duì)性能有非常高的要求、不經(jīng)常變化、占用內(nèi)存不大、有訪問(wèn)整個(gè)集合的需求、數(shù)據(jù)允許不時(shí)時(shí)一致。

Guava cache的優(yōu)點(diǎn)

多種清理和淘汰策略
支持并發(fā)(采用Segment做分區(qū),線程安全)
更新鎖定(對(duì)同一個(gè)key,只讓一個(gè)請(qǐng)求去讀源并回填緩存,其他請(qǐng)求阻塞等待)
集成數(shù)據(jù)源(一般我們?cè)跇I(yè)務(wù)中操作緩存,都會(huì)操作緩存和數(shù)據(jù)源兩部分GuavaCache的get可以集成數(shù)據(jù)源,在從緩存中讀取不到時(shí)可以從數(shù)據(jù)源中讀取數(shù)據(jù)并回填緩存)

使用方法

引入依賴

com.google.guavaguava30.1.1-jre

抽象類

//引入數(shù)據(jù)庫(kù)DAO

//定義緩存的map格式
public LoadingCachetestCache

//初始化
@PostConstruct
private void init(){testCache = CacheBuilder.newBuilder()
	 		// 初始大小
            .initialCapacity(1000)
	 		// 緩存池大小
            .maximumSize(1000)
            // 設(shè)置時(shí)間對(duì)象沒(méi)有被讀/寫訪問(wèn)則對(duì)象從內(nèi)存中刪除
            .expireAfterWrite(100, TimeUnit.MINUTES)
            //設(shè)置時(shí)間刷新緩存
            .refreshAfterWrite(60,TimeUnit.SECONDS)
            // 移除監(jiān)聽(tīng)器
            .removalListener(
                new RemovalListener() {  @Override
                  public void onRemoval(RemovalNotificationrn) {handleRemove.accept(rn.getKey());
                  }
                })
            .recordStats()
            .build(
                new CacheLoader() {//第一次加載
                  @Override
                  public String load(Long aLong) throws Exception {return handleNotExist.apply(aLong);
                  }
                  
                //異步刷新(過(guò)期刷新機(jī)制,調(diào)用LoadingCache.refresh優(yōu)先調(diào)用這里,未重寫則調(diào)上面load)
             	@Override
             	public ListenableFuturereload(Long aLong, String oldValue) throws Exception { 	ListenableFuturetask = ListenableFutureTask.creat( new Callable(){ 	public String call(){ 	//請(qǐng)求數(shù)據(jù)庫(kù)
             		return querySqlDAO(key);
             		}
                });
                refreshTaskExecutor.execute(task);
                return task;
                }
               }
    log.info("初始化緩存");
);

實(shí)現(xiàn)類,直接繼承抽象類后,寫對(duì)應(yīng)的query和refresh函數(shù),參數(shù)判斷,異常處理等。調(diào)用定義緩存LoadingCache的get/refresh方法,其中入?yún)⒍际蔷彺娴膋ey,刷新會(huì)優(yōu)先調(diào)用重寫的reload去更新緩存,一般都重寫為異步加載。如果reload沒(méi)有被重寫,則調(diào)用load走第一次加載的邏輯。

使用的時(shí)候直接調(diào)用實(shí)現(xiàn)類中對(duì)應(yīng)緩存的方法即可。

參考:
https://blog.csdn.net/ABestRookie/article/details/119901114

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

分享標(biāo)題:guava本地緩存CacheLoader使用-創(chuàng)新互聯(lián)
文章路徑:http://muchs.cn/article14/deodde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、網(wǎng)站制作、域名注冊(cè)、做網(wǎng)站建站公司、App開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)