最近代碼里看到有部分關(guān)于guava寫(xiě)本地緩存的,學(xué)習(xí)記錄一下。
首先guava的本地緩存可以理解成一個(gè)緩存map,以kv的形式存數(shù)據(jù),不會(huì)持久化,沒(méi)有支持分布式。比redis使用起來(lái)方便,不用引入額外的組件。如果是單機(jī)緩存的話,可以首先選擇使用這種緩存方式。
Guava cache的設(shè)計(jì)來(lái)源于CurrentHashMap,是線程安全的,可以按照多種策略來(lái)清理存儲(chǔ)在其中的緩存值且保持很高的并發(fā)讀寫(xiě)性能。常見(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.guava guava 30.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)有被讀/寫(xiě)訪問(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)用這里,未重寫(xiě)則調(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)類,直接繼承抽象類后,寫(xiě)對(duì)應(yīng)的query和refresh函數(shù),參數(shù)判斷,異常處理等。調(diào)用定義緩存LoadingCache的get/refresh方法,其中入?yún)⒍际蔷彺娴膋ey,刷新會(huì)優(yōu)先調(diào)用重寫(xiě)的reload去更新緩存,一般都重寫(xiě)為異步加載。如果reload沒(méi)有被重寫(xiě),則調(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://www.2m8n56k.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;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容