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) 。ui

  getAll(Iterable<? extends K>) 方法用來執行批量查詢。默認狀況下,對每一個不在緩存中的鍵,getAll方法會單獨調用CacheLoader.load來加載緩存項。若是批量的加載比多個單個加載更有效,你能夠重載CacheLoader.loadAll來利用這一點。spa

  2) 使用Callable
    Callable支持get(K , Callable<K>) 方法。這個方法可以實現要麼返回緩存中已經存在的相應值,要麼用給定的Callable運算並把結果加入到緩存中。這個方法簡單地實現了模式「若是有緩存則返回;不然運算、緩存、而後返回」。在調用get時傳入一個Callable實例,能夠覆蓋默認的加載運算。操作系統

Guava緩存回收策略

  1).基於容量的回收

          若是要規定緩存項的數目不超過固定值,只須要使用CacheBuilder.maximumSize(Long)。緩存將嘗試回收最近沒有使用或整體上不多使用的緩存項。另外,不一樣的緩存項有不一樣的「權重」——例如,若是你的緩存值,佔據徹底不一樣的內存空間,你可使用CacheBuilder.weigher(Weigher)指定一個權重函數,而且用CacheBuilder.maxinumWeight(long)指定最大總量。重量實在緩存建立時計算的,所以要考慮重量計算的複雜度。 code

  2).定時回收

    expireAfterAccess(long,TimeUnit):緩存項在給定時間內沒有被讀寫訪問,則回收。請注意這種緩存的回收順序和基於大小回收同樣。blog

    expireAfterWrite(long,TimeUnit):緩存項在給定時間內沒有被寫訪問(建立或覆蓋),則回收。若是認爲緩存數據老是在固定時候後變的陳舊不可用,這種回收是可取的。

相關文章
相關標籤/搜索