Guava Cache本地緩存總結


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):緩存項在給定時間內沒有被寫訪問(創建或覆蓋),則回收。如果認為緩存數據總是在固定時候后變的陳舊不可用,這種回收是可取的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM