Guava Cache

1.概覽

Guava Cache 是一個(gè)基于本地緩存的實(shí)現(xiàn),它提供了線程安全的機(jī)制,簡(jiǎn)單易用,性能好。在這篇文章中,我們將看一下Guava Cache的實(shí)現(xiàn) ----最基本的用法,回收策略,緩存刷新以及一些比較有趣的操作。

Guava?(/?ɡwɑ?v?/)[1]?is a common?tropical fruit?cultivated and enjoyed in many tropical and subtropical regions)

2.如何使用Guava Cache

我們先寫(xiě)一個(gè)簡(jiǎn)單的例子---我們利用Guava Cache來(lái)緩存 String實(shí)例的大寫(xiě)形式。

首先,先創(chuàng)建一個(gè)CacheLoader,利用這個(gè)CacheLoader我們可以計(jì)算存儲(chǔ)在cache中的值。從這里開(kāi)始,我們就可以使用給定的規(guī)則利用CacheBuilder 來(lái)創(chuàng)建我們的緩存:


案例1

3.回收策略

從某種程度上來(lái)說(shuō),每一個(gè)緩存都需要清除。我們來(lái)討論一下緩存使用不同規(guī)則的回收策略。

?3.1 根據(jù)大小進(jìn)行回收

我們可以通過(guò) maximumSize()方法來(lái)限制緩存的大小,如果緩存到底了限制之后,cache里面最老的值將會(huì)被回收掉。

?在下面的代碼中,我們把cache的大小限制為3條:


把緩存限制為3

查看執(zhí)行結(jié)果:


控制臺(tái)輸出

可以看到,當(dāng)我們把緩存大小設(shè)置為3之后,在存儲(chǔ)第四個(gè)值時(shí),會(huì)自動(dòng)把第一個(gè)存儲(chǔ)的值給清除掉。


3.2 根據(jù)權(quán)重進(jìn)行回收

除了根據(jù)緩存大小進(jìn)行回收之外,我們還可以使用自定義的權(quán)重函數(shù)來(lái)限制緩存的大小,我們使用長(zhǎng)度作為我們自定義的權(quán)重函數(shù):


根據(jù)權(quán)重進(jìn)行回收

備注: 如果有一個(gè)新的大對(duì)象要放入緩存中的話,緩存為了騰出更多的空間會(huì)把當(dāng)前緩存中的一個(gè)或多個(gè)記錄給清除掉。


3.3 根據(jù)時(shí)間進(jìn)行回收 eviction by time

除了使用大小策略去回收舊記錄之外,我們還可以使用基于時(shí)間的策略來(lái)進(jìn)行回收。在下面的例子中,我們會(huì)讓我們的cache自動(dòng)清除那些空閑2ms的記錄:


基于時(shí)間進(jìn)行清除

我們還能基于記錄的生存時(shí)間來(lái)進(jìn)行回收,在下面的例子中,緩存cache將移除掉那些已經(jīng)在其中中待了超過(guò)2ms的記錄:


自動(dòng)移除生存時(shí)間超過(guò)2ms的記錄



4.弱鍵

下一步,我們來(lái)看一下,如何讓我們的鍵具有弱引用----這樣可以讓垃圾回收器去回收那些不再引用的cache key。默認(rèn)情況下,緩存鍵和緩存值都是具有強(qiáng)引用但是我們可以讓我們的緩存使用弱引用來(lái)存儲(chǔ)這些key:


弱鍵


5.軟值soft value

通過(guò)使用softValues()方法,我們可以讓垃圾收集器去收集我們的緩存值:


軟值

6.處理null值

現(xiàn)在,我們來(lái)看一下如何處理null值。如果你試圖加載一個(gè)null值得話,Guava Cache會(huì)拋出一個(gè)異常---因?yàn)榫彺嬉粋€(gè)null值是毫無(wú)意義的。

但是,如果null值在你的代碼中確實(shí)有用處的話,你可以好好地使用一下Optional類:


處理null值


7.刷新cache

下一節(jié),我們來(lái)看一下如何刷新緩存值。我們可以使用refreshAfterWrite()方法自動(dòng)地刷新我們的cache緩存。在下面的例子中,每一分鐘cache緩存就會(huì)自動(dòng)刷新:


配置緩存自動(dòng)刷新

注意: 你可以使用refresh(key)方法去刷新特定的記錄。


8.預(yù)加載緩存 preload cache

我們可以使用putAll()方法向cache緩存中插入多條記錄。在下面的例子中,我們可以使用map來(lái)向cache中加入多個(gè)記錄:


載入多條記錄



9.清除提醒RemovalNotification

有時(shí)候,當(dāng)有一條記錄從cache緩存中移除時(shí),你需要執(zhí)行一些動(dòng)作,因此,我們來(lái)討論一下,RemovalNotification:我們可以通過(guò)注冊(cè)一個(gè)RemovalListener來(lái)獲取一條記錄的清除提醒,并且我們還可以使用getCache()方法獲取清除的原因。

?在下面的例子中,當(dāng)?shù)谒膫€(gè)元素被放入到cache中之后,我們就會(huì)收到一個(gè)個(gè)RemovalNotification提醒:


清除監(jiān)聽(tīng)器


10.注意事項(xiàng)Notes

最后,這里有幾個(gè)關(guān)于Guava Cache實(shí)現(xiàn)的要點(diǎn):

? ? 1.Guava? Cache是線程安全的

? ? 2.你可以使用put(key,value)方法手動(dòng)地向cache緩存中插入數(shù)據(jù)

? ? 3.你可以使用CacheStats測(cè)量你的緩存性能


11.總結(jié)

這篇文章中,我們寫(xiě)了很多Guava Cache用例-從簡(jiǎn)單地元素清除,刷新,cache預(yù)加載 到 清除提醒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 使用場(chǎng)景 緩存在很多場(chǎng)景下都是相當(dāng)有用的。例如,計(jì)算或檢索一個(gè)值的代價(jià)很高,并且對(duì)同樣的輸入需要不止一次獲取值的時(shí)...
    jiangmo閱讀 866評(píng)論 0 3
  • Google Guava Cache是一種非常優(yōu)秀本地緩存解決方案,提供了基于容量,時(shí)間和引用的緩存回收方式?;?..
    Acamy丶閱讀 26,316評(píng)論 3 34
  • 概述 緩存是日常開(kāi)發(fā)中經(jīng)常應(yīng)用到的一種技術(shù)手段,合理的利用緩存可以極大的改善應(yīng)用程序的性能。Guava官方對(duì)Cac...
    小陳阿飛閱讀 1,874評(píng)論 0 0
  • 上一篇文章:Guava Cache系列之一:如何加載緩存 回收緩存方案 Guava Cache提供了三種基本的緩存...
    驪驊閱讀 4,596評(píng)論 0 3
  • 初中-大學(xué),自己才慢慢的開(kāi)始懂點(diǎn)事,才開(kāi)始寫(xiě)點(diǎn)東西,才開(kāi)始有點(diǎn)認(rèn)知。 我一直都覺(jué)得自己是比一些同齡人,甚至是比我年...
    貝貝丟了殼閱讀 481評(píng)論 1 1

友情鏈接更多精彩內(nèi)容