GUAVA Cache源碼閱讀-cache崩掘、AbstractCache 、AbstractLoadingCache少办、CacheBuilder

  1. cache 接口
    主要有這幾個方法 :
    • V getIfPresent(Object var1);

    • V get(K var1, Callable<? extends V> var2) throws ExecutionException;

    • ImmutableMap<K, V> getAllPresent(Iterable<?> var1);

    • void put(K var1, V var2);

    • void putAll(Map<? extends K, ? extends V> var1);

    • void invalidate(Object var1);

    • void invalidateAll(Iterable<?> var1);

    • void invalidateAll();

    • long size();

    • CacheStats stats();

    • ConcurrentMap<K, V> asMap();

    • void cleanUp();


AbstractCache 是個抽象類 苞慢,繼承了Cache

  1. 如果調用AbstractCache的get、put英妓、size挽放、invalidate、invalidateAll()蔓纠、stats()辑畦、asMap()方法,會拋出UnsupportedOperationException()異常腿倚。
  2. getAllPresent 返回的ImmutableMap為LinkedHashMap纯出。
    當插入一串新數(shù)據(jù)時,會首先判斷是否當前插入的是否存在于之前已經插入的數(shù)據(jù)中 敷燎,如果不存在暂筝,繼續(xù)判斷是否已經當前對象中 ,如果不是懈叹,就插入結果集合乖杠。最后返回結果集合 分扎。
  3. invalidateAll(Iterable<?> keys)澄成,調用invalidate刪除數(shù)據(jù)
  4. 里面有一個SimpleStatsCounter內部類 ,實現(xiàn)了AbstractCache.StatsCounter接口畏吓。
    同時定義了一個LongAddable 接口墨状。
    statsCounter 接口
    public interface StatsCounter
    {
    void recordHits(int var1);
    void recordMisses(int var1);
    void recordLoadSuccess(long var1);
    void recordLoadException(long var1);
    void recordEviction();
    CacheStats snapshot();
    }
    LongAddable 接口
    interface LongAddable
    {
    void increment();
    void add(long var1);
    long sum();
    }
    SimpleStateCounter中定義了一系列LongAddAble操作。包括命中計數(shù)菲饼、未命中計數(shù)肾砂、裝載成功計數(shù)、裝載異常計數(shù)宏悦、總共裝載計數(shù)镐确、換出計數(shù)包吝。(
    long hitCount, long missCount, long loadSuccessCount, long loadExceptionCount, long totalLoadTime, long evictionCount)
    snapshot()函數(shù)將返回當前所有計數(shù)的數(shù)量。
    incrementBy(AbstractCache.StatsCounter other)可以直接在一系列的計數(shù)中加上另外一個AbstractCache.StatsCounter的數(shù)量源葫。

AbstractLoadingCache是個抽象類诗越,繼承了AbstractCache.

方法 含義
V getUnchecked(K key) 暫時不理解
ImmutableMap<K, V> getAll(Iterable<? extends K> keys) 在內部創(chuàng)建了一個鏈表哈希map,將傳入的值放入linkHashMap中,用迭代器進行遍歷息堂。最后返回ImmutableMap類型的對象嚷狞。
V apply(K key) 調用getUnchecked返回對象
refresh 拋出UnsupportedOperationException異常

CacheBuilder
在cacheBuilder的文檔中提到,一個LoadingCache和Cache的實例的構造者應該具有以下特點:
A builder of LoadingCache and Cache instances having any combination of the following features:

  • automatic loading of entries into the cache
  • least-recently-used eviction when a maximum size is exceeded
  • time-based expiration of entries, measured since last access or last write
  • keys automatically wrapped in [weak]references
  • values automatically wrapped in [weak] or [soft] references
  • notification of evicted (or otherwise removed) entries
  • accumulation of cache access statistics

中文翻譯就是

  • 自動裝載實體到內存荣堰。
  • 當超過最大內存時床未,會清除最近最少使用的
  • 按照上次訪問或寫入的時間來測量條目是否達到過期時間振坚。
  • 鍵自動包裹在弱引用中薇搁。
  • 值自動包裹到強引用或軟引用中。
  • 刪除或換出數(shù)據(jù)時有通知
  • 積累緩存訪問的數(shù)據(jù)

These features are all optional; caches can be created using all or none of them. By default cache instances created by CacheBuilder will not perform any type of eviction.

這些功能都是可選的;可以使用全部或不創(chuàng)建高速緩存屡拨。默認情況下只酥,CacheBuilder創(chuàng)建的緩存實例不會執(zhí)行任何類型的逐出。
一個使用cachebuilder的實例:

  LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
   .maximumSize(10000)
   .expireAfterWrite(10, TimeUnit.MINUTES)
   .removalListener(MY_LISTENER)
   .build(
       new CacheLoader<Key, Graph>() {
         public Graph load(Key key) throws AnyException {
           return createExpensiveGraph(key);
         }
       }); 

還有一種創(chuàng)建方式

    String spec = "maximumSize=10000,expireAfterWrite=10m";
     LoadingCache<Key, Graph> graphs = CacheBuilder.from(spec)
    .removalListener(MY_LISTENER)
    .build(
       new CacheLoader<Key, Graph>() {
         public Graph load(Key key) throws AnyException {
           return createExpensiveGraph(key);
         }
       });

這兩種創(chuàng)建方式是等價的呀狼。

The returned cache is implemented as a hash table with similar performance characteristics to ConcurrentHashMap
. It implements all optional operations of the LoadingCache and Cache interfaces. The asMap
view (and its collection views) have weakly consistent iterators. This means that they are safe for concurrent use, but if other threads modify the cache after the iterator is created, it is undefined which of these changes, if any, are reflected in that iterator. These iterators never throw ConcurrentModificationException
.

大概意思如下:

  1. 返回的cache的實現(xiàn)類似于ConcurrentHashMap的哈希表裂允。
    它實現(xiàn)了LoadingCache和Cache的所有接口。
  2. asMap視圖是弱一致的迭代器哥艇。這意味著他們是線程安全的绝编。它沒有定義這些改變,當影響到迭代器時貌踏,這些迭代器絕不會拋出ConcurrentModificationException異常十饥。
  3. 已經換出的數(shù)據(jù)也可能被Cache.size()方法在計數(shù)時計算,但是不能對其進行讀寫操作祖乳。
  4. CacheBuilder<K,V> maximumWeight(long weight)這個方法確定了緩存包含的對象的最大權重逗堵。
    注意權重只是用來決定緩存是否已經超過其最大容量。它對于接下來要將哪個對象換出內存沒有影響眷昆。
    拋出的異常
函數(shù) 返回值 說明
build() Cache<K1,V1> 創(chuàng)建緩存蜒秤,此緩存在請求關鍵字時,不會自動加載值
build(CacheLoader<? super K1,V1> loader) LoadingCache<K1,V1> 創(chuàng)建緩存亚斋。它可以返回給定鍵的已經加載的值作媚,也可以使用提供的CacheLoader來進行原子計算或檢索它
ticker CacheBuilder<K,V> 指定一個納秒精度時間源,用于確定條目何時過期帅刊。
concurrencyLevel(int concurrencyLevel) CacheBuilder<K,V> 指導更新操作之間允許的并發(fā)性纸泡。
initialCapacity(int initialCapacity) CacheBuilder<K,V> 設置內部哈希表的最小長度。
maximumSize(long size) CacheBuilder<K,V> 指定緩存可能包含的最大條目數(shù)赖瞒。
maximumWeight(long weight) CacheBuilder<K,V> 指定緩存可能包含的條目的最大權重女揭。
newBuilder() static CacheBuilder<Object,Object> 構造一個新的CacheBuilder實例蚤假,具有默認設置,包括強大的鍵吧兔,強大的值勤哗,并且沒有任何自動驅逐。
recordStats() CacheBuilder<K,V> 在緩存的操作期間啟用CacheStats的累積
refreshAfterWrite(long duration, TimeUnit unit) CacheBuilder<K,V> 指定在條目創(chuàng)建后經過固定持續(xù)時間或最近更換其值后掩驱,活動條目符合自動刷新的條件芒划。
from(String spec) static CacheBuilder<Object,Object> 使用規(guī)范中指定的設置構造新的CacheBuilder實例
removalListener(RemovalListener<? super K1,? super V1> listener) <K1 extends K,V1 extends V> CacheBuilder<K1,V1> 指定一個監(jiān)聽器實例,高速緩存在任何情況下欧穴,每次刪除一個條目時應該通知它民逼。
softValues() CacheBuilder<K,V> 指定存儲在緩存中的每個值(非鍵)都應該包裝在SoftReference中(默認情況下铜涉,使用強引用)蜕企。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末瑰剃,一起剝皮案震驚了整個濱河市盔几,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慨菱,老刑警劉巖残揉,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昏苏,死亡現(xiàn)場離奇詭異弦叶,居然都是意外死亡俊犯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門伤哺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來燕侠,“玉大人,你說我怎么就攤上這事立莉【钔” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵蜓耻,是天一觀的道長茫舶。 經常有香客問我,道長刹淌,這世上最難降的妖魔是什么饶氏? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮芦鳍,結果婚禮上嚷往,老公的妹妹穿的比我還像新娘葛账。我一直安慰自己柠衅,他們只是感情好,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布籍琳。 她就那樣靜靜地躺著菲宴,像睡著了一般贷祈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喝峦,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天势誊,我揣著相機與錄音,去河邊找鬼谣蠢。 笑死粟耻,一個胖子當著我的面吹牛,可吹牛的內容都是我干的眉踱。 我是一名探鬼主播挤忙,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谈喳!你這毒婦竟也來了册烈?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤婿禽,失蹤者是張志新(化名)和其女友劉穎赏僧,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扭倾,經...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡淀零,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了膛壹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窑滞。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖恢筝,靈堂內的尸體忽然破棺而出哀卫,到底是詐尸還是另有隱情,我是刑警寧澤撬槽,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布此改,位于F島的核電站,受9級特大地震影響侄柔,放射性物質發(fā)生泄漏共啃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一暂题、第九天 我趴在偏房一處隱蔽的房頂上張望移剪。 院中可真熱鬧,春花似錦薪者、人聲如沸纵苛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽攻人。三九已至取试,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間怀吻,已是汗流浹背瞬浓。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蓬坡,地道東北人猿棉。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像屑咳,于是被迫代替她去往敵國和親铺根。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理乔宿,服務發(fā)現(xiàn)位迂,斷路器,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 為誰而作?是一件非常重要的事情坝橡。 考慮到作是一個非常寬泛的動詞泻帮,我們暫且把此處的“作”,看作是創(chuàng)作的作计寇。如果分得再...
    崗鑒閱讀 339評論 0 3
  • 我們每個人都有一個夢想番宁,希望未來的家庭生活充滿了智能元莫,就如同科幻小說里描寫的那樣,至少也應該有個“大白”陪伴蝶押。實際...
    花捧娛樂vlog視頻植入閱讀 358評論 0 0
  • 各位小伙伴們大家好踱蠢,這幾天弱弱的看了看老掉牙的支持向量機(Support Vector Machine, SVM)...
    云時之間閱讀 1,397評論 1 3
  • 今天和大米結束了她喜歡的《窗邊的小豆豆》,開始了《瘋狂的學衅宓纾》茎截。一所日本學校的學校生活,一所美國的學校生活赶盔;兩個國...
    悅米時光閱讀 150評論 0 0