Guava Cache系列之二:如何回收緩存

上一篇文章:Guava Cache系列之一:如何加載緩存

回收緩存方案

Guava Cache提供了三種基本的緩存回收方式:

  • 基于容量回收
  • 定時回收
  • 基于引用回收

1、基于容量的回收(size-based eviction)

緩存將嘗試回收最近沒有使用或總體上很少使用的緩存項微酬《端——警告:在緩存項的數(shù)目達到限定值之前薇芝,緩存就可能進行回收操作——通常來說,這種情況發(fā)生在緩存項的數(shù)目逼近限定值時。


另外,不同的緩存項有不同的“權重”(weights)——例如泉哈,如果你的緩存值,占據(jù)完全不同的內存空間破讨,你可以使用CacheBuilder.weigher(Weigher)指定一個權重函數(shù)丛晦,并且用CacheBuilder.maximumWeight(long)指定最大總重。在權重限定場景中提陶,除了要注意回收也是在重量逼近限定值時就進行了烫沙,還要知道重量是在緩存創(chuàng)建時計算的,因此要考慮重量計算的復雜度隙笆。

LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
        .maximumWeight(100000)
        .weigher(new Weigher<Key, Graph>() {
            public int weigh(Key k, Graph g) {
                return g.vertices().size();
            }
        })
        .build(
            new CacheLoader<Key, Graph>() {
                public Graph load(Key key) { // no checked exception
                    return createExpensiveGraph(key);
                }
            });

2锌蓄、定時回收(Timed Eviction)

CacheBuilder提供兩種定時回收的方法:

  • expireAfterAccess(long, TimeUnit):緩存項在給定時間內沒有被讀/寫訪問,則回收撑柔。請注意這種緩存的回收順序和基于大小回收一樣瘸爽。
  • expireAfterWrite(long, TimeUnit):緩存項在給定時間內沒有被寫訪問(創(chuàng)建或覆蓋),則回收铅忿。如果認為緩存數(shù)據(jù)總是在固定時候后變得陳舊不可用剪决,這種回收方式是可取的。

如下文所討論檀训,定時回收周期性地在寫操作中執(zhí)行柑潦,偶爾在讀操作中執(zhí)行。

3峻凫、基于引用的回收(Reference-based Eviction)

通過使用弱引用的鍵妒茬、或弱引用的值、或軟引用的值蔚晨,Guava Cache可以把緩存設置為允許垃圾回收乍钻。關于軟引用個弱引用的概念可以參考強引用肛循、弱引用、軟引用银择、虛引用

  • CacheBuilder.weakKeys():使用弱引用存儲鍵多糠。當鍵沒有其它(強或軟)引用時,緩存項可以被垃圾回收浩考。因為垃圾回收僅依賴恒等式(==)夹孔,使用弱引用鍵的緩存用==而不是equals比較鍵
  • CacheBuilder.weakValues():使用弱引用存儲值析孽。當值沒有其它(強或軟)引用時搭伤,緩存項可以被垃圾回收。因為垃圾回收僅依賴恒等式(==)袜瞬,使用弱引用值的緩存用==而不是equals比較值怜俐。
  • CacheBuilder.softValues():使用軟引用存儲值。軟引用只有在響應內存需要時邓尤,才按照全局最近最少使用的順序回收拍鲤。考慮到使用軟引用的性能影響汞扎,我們通常建議使用更有性能預測性的緩存大小限定(見上文季稳,基于容量回收)。使用軟引用值的緩存同樣用==而不是equals比較值澈魄。

3景鼠、顯式清除

任何時候,你都可以顯式地清除緩存項痹扇,而不是等到它被回收:

清理什么時候發(fā)生铛漓?

  • 使用CacheBuilder構建的緩存不會"自動"執(zhí)行清理和回收工作,也不會在某個緩存項過期后馬上清理帘营,也沒有諸如此類的清理機制票渠。相反,它會在寫操作時順帶做少量的維護工作芬迄,或者偶爾在讀操作時做——如果寫操作實在太少的話问顷。
  • 這樣做的原因在于:如果要自動地持續(xù)清理緩存,就必須有一個線程禀梳,這個線程會和用戶操作競爭共享鎖杜窄。此外,某些環(huán)境下線程創(chuàng)建可能受限制算途,這樣CacheBuilder就不可用了塞耕。
  • 相反,我們把選擇權交到你手里嘴瓤。如果你的緩存是高吞吐的扫外,那就無需擔心緩存的維護和清理等工作莉钙。如果你的 緩存只會偶爾有寫操作,而你又不想清理工作阻礙了讀操作筛谚,那么可以創(chuàng)建自己的維護線程磁玉,以固定的時間間隔調用Cache.cleanUp()ScheduledExecutorService可以幫助你很好地實現(xiàn)這樣的定時調度驾讲。

刷新

  • 刷新和回收不太一樣蚊伞。正如LoadingCache.refresh(K)所聲明,刷新表示為鍵加載新值吮铭,這個過程可以是異步的时迫。在刷新操作進行時,緩存仍然可以向其他線程返回舊值.
  • 而不像回收操作谓晌,讀緩存的線程必須等待新值加載完成掠拳。
  • 如果刷新過程拋出異常,緩存將保留舊值扎谎,而異常會在記錄到日志后被丟棄[swallowed]碳想。

參考文章

CachesExplained

下一篇文章:Guava Cache系列之三:源碼分析

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末烧董,一起剝皮案震驚了整個濱河市毁靶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逊移,老刑警劉巖预吆,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異胳泉,居然都是意外死亡拐叉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門扇商,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凤瘦,“玉大人,你說我怎么就攤上這事案铺∈呓妫” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵控汉,是天一觀的道長笔诵。 經常有香客問我,道長姑子,這世上最難降的妖魔是什么乎婿? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮街佑,結果婚禮上谢翎,老公的妹妹穿的比我還像新娘捍靠。我一直安慰自己,他們只是感情好森逮,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布剂公。 她就那樣靜靜地躺著,像睡著了一般吊宋。 火紅的嫁衣襯著肌膚如雪纲辽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天璃搜,我揣著相機與錄音拖吼,去河邊找鬼。 笑死这吻,一個胖子當著我的面吹牛吊档,可吹牛的內容都是我干的。 我是一名探鬼主播唾糯,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼怠硼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了移怯?” 一聲冷哼從身側響起香璃,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舟误,沒想到半個月后葡秒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡嵌溢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年眯牧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赖草。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡学少,死狀恐怖,靈堂內的尸體忽然破棺而出秧骑,到底是詐尸還是另有隱情版确,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布腿堤,位于F島的核電站阀坏,受9級特大地震影響,放射性物質發(fā)生泄漏笆檀。R本人自食惡果不足惜忌堂,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酗洒。 院中可真熱鬧士修,春花似錦枷遂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沸移,卻和暖如春痪伦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雹锣。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工网沾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蕊爵。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓辉哥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親攒射。 傳聞我的和親對象是個殘疾皇子醋旦,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容

  • com.google.common.cache 1、背景 緩存会放,在我們日常開發(fā)中是必不可少的一種解決性能問題的方法...
    拾壹北閱讀 22,297評論 0 25
  • Google Guava Cache是一種非常優(yōu)秀本地緩存解決方案饲齐,提供了基于容量,時間和引用的緩存回收方式鸦概÷嵴牛基于...
    Acamy丶閱讀 25,900評論 3 34
  • 曉林Liu閱讀 158評論 0 1
  • 1. 控制車速 雨天路滑咨察,視野不清,一定要控制車速福青,保持足夠的安全車距摄狱,平時經常經過的路段也不要大意。雨天突發(fā)情況...
    跑車的世界閱讀 355評論 0 0
  • 我們過的是以后无午,不是過從前媒役。 翻了翻空間說說,發(fā)現(xiàn)自己以前是多傻逼宪迟,怎么會發(fā)這種說說照片酣衷。 下面評論的人早已沒有備...
    都樂很可愛閱讀 284評論 0 2