關(guān)于Guava緩存詳解及使用說(shuō)明_第1頁(yè)
關(guān)于Guava緩存詳解及使用說(shuō)明_第2頁(yè)
關(guān)于Guava緩存詳解及使用說(shuō)明_第3頁(yè)
關(guān)于Guava緩存詳解及使用說(shuō)明_第4頁(yè)
關(guān)于Guava緩存詳解及使用說(shuō)明_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第關(guān)于Guava緩存詳解及使用說(shuō)明目錄緩存Guavacache詳細(xì)配置緩存的并發(fā)級(jí)別緩存的初始容量設(shè)置設(shè)置最大存儲(chǔ)緩存清除策略顯式清除CacheLoadingCache

緩存

緩存分為本地緩存與分布式緩存。

本地緩存為了保證線程安全問(wèn)題,一般使用ConcurrentMap的方式保存在內(nèi)存之中,而常見(jiàn)的分布式緩存則有Redis,MongoDB等。

一致性:本地緩存由于數(shù)據(jù)存儲(chǔ)于內(nèi)存之中,每個(gè)實(shí)例都有自己的副本,可能會(huì)存在不一致的情況;分布式緩存則可有效避免這種情況開(kāi)銷:本地緩存會(huì)占用JVM內(nèi)存,會(huì)影響GC及系統(tǒng)性能;分布式緩存的開(kāi)銷則在于網(wǎng)絡(luò)時(shí)延和對(duì)象序列化,故主要影響調(diào)用時(shí)延適用場(chǎng)景:本地緩存適用于數(shù)據(jù)量較小或變動(dòng)較少的數(shù)據(jù);分布式緩存則適用于一致性要求較高及數(shù)量量大的場(chǎng)景(可彈性擴(kuò)容)

本地緩存適用于數(shù)據(jù)量較小或變動(dòng)較少的數(shù)據(jù),因?yàn)樽儎?dòng)多需要考慮到不同實(shí)例的緩存一致性問(wèn)題,而數(shù)據(jù)量大則需要考慮緩存回收策略及GC相關(guān)的問(wèn)題

Guavacache

GuavaCache是GoogleFuava中的一個(gè)內(nèi)存緩存模塊,用于將數(shù)據(jù)緩存到JVM內(nèi)存中。

提供了get、put封裝操作,能夠集成數(shù)據(jù)源;線程安全的緩存,與ConcurrentMap相似,但前者增加了更多的元素失效策略,后者只能顯示的移除元素;GuavaCache提供了多種基本的緩存回收方式監(jiān)控緩存加載/命中情況

通常,Guava緩存適用于以下情況:

愿意花費(fèi)一些內(nèi)存來(lái)提高速度。使用場(chǎng)景有時(shí)會(huì)多次查詢key。緩存將不需要存儲(chǔ)超出RAM容量的數(shù)據(jù)

詳細(xì)配置

緩存的并發(fā)級(jí)別

Guava提供了設(shè)置并發(fā)級(jí)別的API,使得緩存支持并發(fā)的寫入和讀取。

與ConcurrentHashMap類似,Guavacache的并發(fā)也是通過(guò)分離鎖實(shí)現(xiàn)。

在通常情況下,推薦將并發(fā)級(jí)別設(shè)置為服務(wù)器cpu核心數(shù)。

CacheBuilder.newBuilder()

//設(shè)置并發(fā)級(jí)別為cpu核心數(shù),默認(rèn)為4

.concurrencyLevel(Runtime.getRuntime().availableProcessors())

.build();

緩存的初始容量設(shè)置

我們?cè)跇?gòu)建緩存時(shí)可以為緩存設(shè)置一個(gè)合理大小初始容量,由于Guava的緩存使用了分離鎖的機(jī)制,擴(kuò)容的代價(jià)非常昂貴。

所以合理的初始容量能夠減少緩存容器的擴(kuò)容次數(shù)。

CacheBuilder.newBuilder()

//設(shè)置初始容量為100

.initialCapacity(100)

.build();

設(shè)置最大存儲(chǔ)

GuavaCache可以在構(gòu)建緩存對(duì)象時(shí)指定緩存所能夠存儲(chǔ)的最大記錄數(shù)量。

當(dāng)Cache中的記錄數(shù)量達(dá)到最大值后再調(diào)用put方法向其中添加對(duì)象,Guava會(huì)先從當(dāng)前緩存的對(duì)象記錄中選擇一條刪除掉,騰出空間后再將新的對(duì)象存儲(chǔ)到Cache中。

CacheBuilder.newBuilder()

//設(shè)置最大容量為1000

.maximumSize(1000)

.build();

緩存清除策略

基于存活時(shí)間的清除策略

expireAfterWrite寫緩存后多久過(guò)期expireAfterAccess讀寫緩存后多久過(guò)期

存活時(shí)間策略可以單獨(dú)設(shè)置或組合配置

基于容量的清除策略

通過(guò)CacheBuilder.maximumSize(long)方法可以設(shè)置Cache的最大容量數(shù),當(dāng)緩存數(shù)量達(dá)到或接近該最大值時(shí),Cache將清除掉那些最近最少使用的緩存

基于權(quán)重的清除策略

使用CacheBuilder.weigher(Weigher)指定一個(gè)權(quán)重函數(shù),并且用CacheBuilder.maximumWeight(long)指定最大總重。

如每一項(xiàng)緩存所占據(jù)的內(nèi)存空間大小都不一樣,可以看作它們有不同的權(quán)重(weights),作為執(zhí)行清除策略時(shí)優(yōu)化回收的對(duì)象

LoadingCacheKey,Graphgraphs=CacheBuilder.newBuilder()

.maximumWeight(100000)

.weigher(newWeigherKey,Graph(){

publicintweigh(Keyk,Graphg){

returng.vertices().size();

.build(

newCacheLoaderKey,Graph(){

publicGraphload(Keykey){//nocheckedexception

returncreateExpensiveGraph(key);

});

顯式清除

清除單個(gè)key:Cache.invalidate(key)批量清除key:Cache.invalidateAll(keys)清除所有緩存項(xiàng):Cache.invalidateAll()

基于引用的清除策略

在構(gòu)建Cache實(shí)例過(guò)程中,通過(guò)設(shè)置使用弱引用的鍵、或弱引用的值、或軟引用的值,從而使JVM在GC時(shí)順帶實(shí)現(xiàn)緩存的清除

CacheBuilder.weakKeys():使用弱引用存儲(chǔ)鍵。當(dāng)鍵沒(méi)有其它(強(qiáng)或軟)引用時(shí),緩存項(xiàng)可以被垃圾回收CacheBuilder.weakValues():使用弱引用存儲(chǔ)值。當(dāng)值沒(méi)有其它(強(qiáng)或軟)引用時(shí),緩存項(xiàng)可以被垃圾回收CacheBuilder.softValues():使用軟引用存儲(chǔ)值。軟引用只有在響應(yīng)內(nèi)存需要時(shí),才按照全局最近最少使用的順序回收??紤]到使用軟引用的性能影響,我們通常建議使用更有性能預(yù)測(cè)性的緩存大小限定

垃圾回收僅依賴==恒等式,使用弱引用鍵的緩存用而不是equals(),即同一對(duì)象引用。

Cache

顯式put操作置入內(nèi)存

privatestaticCacheInteger,IntegernumCache=CacheBuilder.newBuilder()

.expireAfterWrite(5,TimeUnit.MINUTES)

.build();

publicstaticvoidmain(String[]args)throwsException{

System.out.println(numCache.getIfPresent(1));

Thread.sleep(1000);

System.out.println(numCache.getIfPresent(1));

Thread.sleep(1000);

numCache.put(1,5);

System.out.println(numCache.getIfPresent(1));

//console:nullnull5

}

LoadingCache

使用自定義ClassLoader加載數(shù)據(jù),置入內(nèi)存中。從LoadingCache中獲取數(shù)據(jù)時(shí),若數(shù)據(jù)存在則直接返回;若數(shù)據(jù)不存在,則根據(jù)ClassLoader的load方法加載數(shù)據(jù)至內(nèi)存,然后返回該數(shù)據(jù)

privatestaticLoadingCacheInteger,IntegernumCache=CacheBuilder.newBuilder().

expireAfterWrite(5L,TimeUnit.MINUTES).

maximumSize(5000L).

build(newCacheLoaderInteger,Integer(){

@Override

publicIntegerload(Integerkey)throwsException{

System.out.println("nocache");

returnkey*5;

publicstaticvoidmain(String[]args)throwsException{

System.out.println(numCache.get(1));

Thread.sleep(100

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論