Guava Cache本地緩存總結
1.緩存分類
CPU緩存、操作系統緩存、本地緩存、分布式緩存、Http緩存、數據庫緩存。
2.Guava Cache緩存適用場景
1) 你願意消耗一些內存空間來提升速度。
2) 你預料到某些鍵會被查詢一次以上。
3) 緩存中存放的數據總量不會超過內存容量。(Guava Cache是單個應用運行時的本地緩存。它不把數據存放到文件或者外部服務器上。)
3.Guava Cache 創建的方式
1) LoadingCache
LoadingCahce是附帶CacheLoader構建而成的緩存實現。構建自己的CacheLoader通常只需要簡單地實現V load(K key) throws Exception方法。例如,你可以使用下面的代碼構建LoadingCache
LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() .maximumSize(1000) .build( new CacheLoader<Key, Graph>() { public Graph load(Key key) throws AnyException { return createExpensiveGraph(key); } }); ... try { return graphs.get(key); } catch (ExecutionException e) { throw new OtherException(e.getCause()); }
從LoadingCache中get數據的正規方式是get(K)方法。這個方法要么返回已經緩存的值,要么使用CacheLoader向緩存原子地加載新值。由於CacheLoader可能拋出異常,LoadingCache.get(K) 也聲明為拋出ExecutionException異常。如果你定義的CacheLoader沒有聲明任何檢查異常,則可以通過getUnchecked(K)查找緩存;但必須注意,一旦CacheLoader聲明了檢查異常,就不可以調用getUnchecked(K) 。
getAll(Iterable<? extends K>) 方法用來執行批量查詢。默認情況下,對每個不在緩存中的鍵,getAll方法會單獨調用CacheLoader.load來加載緩存項。如果批量的加載比多個單個加載更有效,你可以重載CacheLoader.loadAll來利用這一點。
2) 使用Callable
Callable支持get(K , Callable<K>) 方法。這個方法能夠實現要么返回緩存中已經存在的相應值,要么用給定的Callable運算並把結果加入到緩存中。這個方法簡單地實現了模式“如果有緩存則返回;否則運算、緩存、然后返回”。在調用get時傳入一個Callable實例,可以覆蓋默認的加載運算。
Guava緩存回收策略
1).基於容量的回收
如果要規定緩存項的數目不超過固定值,只需要使用CacheBuilder.maximumSize(Long)。緩存將嘗試回收最近沒有使用或總體上很少使用的緩存項。另外,不同的緩存項有不同的“權重”——例如,如果你的緩存值,占據完全不同的內存空間,你可以使用CacheBuilder.weigher(Weigher)指定一個權重函數,並且用CacheBuilder.maxinumWeight(long)指定最大總量。重量實在緩存創建時計算的,因此要考慮重量計算的復雜度。
2).定時回收
expireAfterAccess(long,TimeUnit):緩存項在給定時間內沒有被讀寫訪問,則回收。請注意這種緩存的回收順序和基於大小回收一樣。
expireAfterWrite(long,TimeUnit):緩存項在給定時間內沒有被寫訪問(創建或覆蓋),則回收。如果認為緩存數據總是在固定時候后變的陳舊不可用,這種回收是可取的。