版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中學(xué)學(xué)生社團(tuán)活動(dòng)經(jīng)費(fèi)預(yù)算制度
- 養(yǎng)老院定期體檢制度
- 企業(yè)內(nèi)部保密工作責(zé)任追究制度
- 公共交通車輛安全檢查制度
- 2026年工業(yè)制造中的6S管理與效率提升題解
- 2026年公務(wù)員考試模擬題行政職業(yè)能力測(cè)驗(yàn)與申論練習(xí)
- 2026年航空航天基礎(chǔ)知識(shí)學(xué)習(xí)入門與實(shí)踐題庫(kù)
- 2026年體育訓(xùn)練與健康管理測(cè)試題目
- 2026年企業(yè)管理實(shí)務(wù)能力測(cè)試題
- 2026年版權(quán)侵權(quán)監(jiān)測(cè)協(xié)議(實(shí)時(shí)·發(fā)現(xiàn)版)
- 維權(quán)中心工作流程
- 星光精細(xì)化工(張家港)有限公司造紙
- DZ∕T 0219-2006 滑坡防治工程設(shè)計(jì)與施工技術(shù)規(guī)范(正式版)
- 《配電網(wǎng)設(shè)施可靠性評(píng)價(jià)指標(biāo)導(dǎo)則》
- 街道(鄉(xiāng)鎮(zhèn))區(qū)域養(yǎng)老服務(wù)中心建設(shè)驗(yàn)收指標(biāo)總分表及驗(yàn)收標(biāo)準(zhǔn)
- 國(guó)家衛(wèi)生部《綜合醫(yī)院分級(jí)管理標(biāo)準(zhǔn)》
- 預(yù)防兩癌知識(shí)講座
- 人教版九年級(jí)數(shù)學(xué)第二十四章《圓》單元知識(shí)點(diǎn)總結(jié)
- 西班牙語(yǔ)專業(yè)本科論文模板
- GB/T 42288-2022電化學(xué)儲(chǔ)能電站安全規(guī)程
- 地質(zhì)災(zāi)害治理工程用表格(完整資料)
評(píng)論
0/150
提交評(píng)論