創(chuàng)建guava緩存

  1. 適用性
    緩存在很多情況下都是非常有用的惠险。比如诡蜓,我們需要多次根據(jù)給定的輸入獲取值诽表,而且該值計算或者獲取的開銷是非常昂貴的起趾。
    緩存和ConcurrentMap是非常相像的诗舰,但是它們也不完全一樣。最根本的區(qū)別就是阳掐,ConcurrentMap會持有所有添加的對象始衅,直到被顯示的移除。而緩存為了限制其內存的使用缭保,通常都會配置成可以自動的將對象移除。在某些情況下即使不自動移除對象也是非常有用的蝙茶,如LoadingCache它會自動加載緩存對象艺骂。
    一般,Guava緩存適用于以下幾種情況:

    • 你愿意花費一些內存來換取性能提升隆夯;
    • 你預測到某些鍵會多次進行查詢钳恕;
    • 你的緩存數(shù)據(jù)不超過內存(Guava緩存是單個應用中的本地緩存。它不會將數(shù)據(jù)存儲到文件中蹄衷,或者外部服務器忧额。如果不適合你,可以考慮一下 Memcached)愧口。

    如果你的需要符合上面所說的每一條睦番,那么選擇Guava緩存絕對沒錯。

  2. 創(chuàng)建guava cache
    對于緩存首先需要明確的是:有沒有一個方法可以通過給定的鍵來計算/加載相應的值?如果有托嚣,那么可以使用CacheLoader巩检。如果沒有這樣的方法,或者你想復寫緩存的加載方式示启,但你仍想保留“get-if-absent-compute”語義兢哭,你可以在調用get方法時傳入一個Callable實例,來達到目的夫嗓。緩存的對象可以通過Cache.put直接插入迟螺,但是自動加載是首選,因為自動加載可以更加容易的判斷所有緩存信息的一致性舍咖。
    Guava Cache有兩種創(chuàng)建方式:

    • cacheLoader
    • callable callback
    1. LoadingCache 緩存是通過一個CacheLoader來構建緩存矩父。創(chuàng)建一個CacheLoader僅需要實現(xiàn)V load(K key) throws Exception方法即可。下面的范例就是如何創(chuàng)建一個LoadingCache谎仲。
      LoadingCache<Key,Graph> graphs =CacheBuilder.newBuilder() .maximumSize(1000) .build( newCacheLoader<Key,Graph>(){ publicGraph load(Key key)throwsAnyException{ return createExpensiveGraph(key); } }); try{ return graphs.get(key);
      }catch(ExecutionException e){ thrownewOtherException(e.getCause()); }
    2. callable callback的實現(xiàn):
      Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(1000).build(); String resultVal = cache.get("jerry", new Callable<String>() { public String call() { String strProValue="hello "+"jerry"+"!"; return strProValue; } }); System.out.println("jerry value : " + resultVal); resultVal = cache.get("peida", new Callable<String>() { public String call() { String strProValue="hello "+"peida"+"!"; return strProValue; } }); System.out.println("peida value : " + resultVal);
  3. guava Cache數(shù)據(jù)移除:

guava做cache時候數(shù)據(jù)的移除方式浙垫,在guava中數(shù)據(jù)的移除分為被動移除和主動移除兩種。
  被動移除數(shù)據(jù)的方式郑诺,guava默認提供了三種方式:
  1. 基于大小的移除:看字面意思就知道就是按照緩存的大小來移除夹姥,如果即將到達指定的大小,那就會把不常用的鍵值對從cache中移除辙诞。
  定義的方式一般為 CacheBuilder.maximumSize(long)辙售,還有一種一種可以算權重的方法,個人認為實際使用中不太用到飞涂。就這個常用的來看有幾個注意點旦部,
    其一,這個size指的是cache中的條目數(shù)较店,不是內存大小或是其他士八;
    其二,并不是完全到了指定的size系統(tǒng)才開始移除不常用的數(shù)據(jù)的梁呈,而是接近這個size的時候系統(tǒng)就會開始做移除的動作婚度;
    其三,如果一個鍵值對已經(jīng)從緩存中被移除了官卡,你再次請求訪問的時候蝗茁,如果cachebuild是使用cacheloader方式的,那依然還是會從cacheloader中再取一次值寻咒,如果這樣還沒有哮翘,就會拋出異常
  2. 基于時間的移除:guava提供了兩個基于時間移除的方法
    expireAfterAccess(long, TimeUnit) 這個方法是根據(jù)某個鍵值對最后一次訪問之后多少時間后移除
    expireAfterWrite(long, TimeUnit) 這個方法是根據(jù)某個鍵值對被創(chuàng)建或值被替換后多少時間移除
  3. 基于引用的移除:
  這種移除方式主要是基于java的垃圾回收機制,根據(jù)鍵或者值的引用關系決定移除
  主動移除數(shù)據(jù)方式毛秘,主動移除有三種方法:
  1.單獨移除用 Cache.invalidate(key)
  2.批量移除用 Cache.invalidateAll(keys)
  3.移除所有用 Cache.invalidateAll()
  如果需要在移除數(shù)據(jù)的時候有所動作還可以定義Removal Listener饭寺,但是有點需要注意的是默認Removal Listener中的行為是和移除動作同步執(zhí)行的,如果需要改成異步形式,可以考慮使用RemovalListeners.asynchronous(RemovalListener, Executor) (******)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末佩研,一起剝皮案震驚了整個濱河市柑肴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旬薯,老刑警劉巖晰骑,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異绊序,居然都是意外死亡硕舆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門骤公,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抚官,“玉大人,你說我怎么就攤上這事阶捆×杞冢” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵洒试,是天一觀的道長倍奢。 經(jīng)常有香客問我,道長垒棋,這世上最難降的妖魔是什么卒煞? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮叼架,結果婚禮上畔裕,老公的妹妹穿的比我還像新娘。我一直安慰自己乖订,他們只是感情好扮饶,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著乍构,像睡著了一般贴届。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蜡吧,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機與錄音占键,去河邊找鬼昔善。 笑死,一個胖子當著我的面吹牛畔乙,可吹牛的內容都是我干的君仆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼返咱!你這毒婦竟也來了钥庇?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤咖摹,失蹤者是張志新(化名)和其女友劉穎评姨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萤晴,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡吐句,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了店读。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗦枢。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖屯断,靈堂內的尸體忽然破棺而出文虏,到底是詐尸還是另有隱情,我是刑警寧澤殖演,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布氧秘,位于F島的核電站,受9級特大地震影響剃氧,放射性物質發(fā)生泄漏敏储。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一朋鞍、第九天 我趴在偏房一處隱蔽的房頂上張望已添。 院中可真熱鬧,春花似錦滥酥、人聲如沸更舞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缆蝉。三九已至,卻和暖如春瘦真,著一層夾襖步出監(jiān)牢的瞬間刊头,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工诸尽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留原杂,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓您机,卻偏偏與公主長得像穿肄,于是被迫代替她去往敵國和親饮醇。 傳聞我的和親對象是個殘疾皇子颠锉,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理生均,服務發(fā)現(xiàn)慎陵,斷路器,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • com.google.common.cache 1脑溢、背景 緩存僵朗,在我們日常開發(fā)中是必不可少的一種解決性能問題的方法...
    拾壹北閱讀 22,256評論 0 25
  • 很多次酱酬,開始想要記錄自己的心情壶谒,自己的變化。卻一次次起筆膳沽,又落筆汗菜。終沒有結果。 今天沒什么不一樣挑社≡山纾或許心情有點低...
    小孩兒夏天閱讀 197評論 2 1
  • 回首便是孤獨,無言已是深愛 游走過的云端痛阻,牽著著你靜默無言 這份愛有過無奈菌瘪,挫敗,還有那反復的糾纏 終究是少年 主...
    里予者閱讀 229評論 0 7