天天看點

GuavaCache記憶體緩存 理論 + 實踐

兩篇很好的文章:

偏理論:https://blog.csdn.net/xlgen157387/article/details/47293517

偏實踐:https://blog.csdn.net/u012859681/article/details/75220605

适用性

緩存在很多場景下都是相當有用的。例如,計算或檢索一個值的代價很高,并且對同樣的輸入需要不止一次擷取值的時候,就應當考慮使用緩存。

Guava Cache與ConcurrentMap的差別:

他們很相似,但也不完全一樣。最基本的差別是ConcurrentMap會一直儲存所有添加的元素,直到顯式地移除。相對地,Guava Cache為了限制記憶體占用,通常都設定為自動回收元素。在某些場景下,盡管LoadingCache 不回收元素,它也是很有用的,因為它會自動加載緩存。

通常來說,Guava Cache适用于:

你願意消耗一些記憶體空間來提升速度。
你預料到某些鍵會被查詢一次以上。
緩存中存放的資料總量不會超出記憶體容量。(Guava Cache是單個應用運作時的本地緩存。它不把資料存放到檔案或外部伺服器。如果這不符合你的需求,請嘗試Memcached這類工具)
           

如果你的場景符合上述的每一條,Guava Cache就适合你。

如同範例代碼展示的一樣,Cache執行個體通過CacheBuilder生成器模式擷取,但是自定義你的緩存才是最有趣的部分。

注:如果你不需要Cache中的特性,使用ConcurrentHashMap有更好的記憶體效率——但Cache的大多數特性都很難基于舊有的ConcurrentMap複制,甚至根本不可能做到。

加載

在使用緩存前,首先問自己一個問題:有沒有合理的預設方法來加載或計算與鍵關聯的值?如果有的話,你應當使用CacheLoader。如果沒有,或者你想要覆寫預設的加載運算,同時保留”擷取緩存-如果沒有-則計算”[get-if-absent-compute]的原子語義,你應該在調用get時傳入一個Callable執行個體。緩存元素也可以通過Cache.put方法直接插入,但自動加載是首選的,因為它可以更容易地推斷所有緩存内容的一緻性。