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)建我們的緩存:

3.回收策略
從某種程度上來(lái)說(shuō),每一個(gè)緩存都需要清除。我們來(lái)討論一下緩存使用不同規(guī)則的回收策略。
?3.1 根據(jù)大小進(jìn)行回收
我們可以通過(guò) maximumSize()方法來(lái)限制緩存的大小,如果緩存到底了限制之后,cache里面最老的值將會(huì)被回收掉。
?在下面的代碼中,我們把cache的大小限制為3條:

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

可以看到,當(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ù):

備注: 如果有一個(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í)間來(lái)進(jìn)行回收,在下面的例子中,緩存cache將移除掉那些已經(jīng)在其中中待了超過(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類:

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

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ù)加載 到 清除提醒。