guava 本地緩存

介紹

Guava cache是本地緩存的一種實(shí)現(xiàn)。

Guava Cache與ConcurrentMap很相似考杉,但也不完全一樣矫付。最基本的區(qū)別是ConcurrentMap會(huì)一直保存所有添加的元素蹂空,直到顯式地移除俯萌。相對(duì)地,Guava Cache為了限制內(nèi)存占用上枕,通常都設(shè)定為自動(dòng)回收元素咐熙。在某些場(chǎng)景下,盡管LoadingCache 不回收元素姿骏,它也是很有用的糖声,因?yàn)樗鼤?huì)自動(dòng)加載緩存。

應(yīng)用場(chǎng)景

  • 對(duì)讀取性能要求高分瘦,空間換時(shí)間蘸泻,愿意消耗一定的內(nèi)存空間來(lái)提高讀取速度
  • 預(yù)測(cè)到會(huì)存在熱數(shù)據(jù),會(huì)進(jìn)行頻繁的讀取操作
  • 緩存數(shù)據(jù)不會(huì)超過(guò)內(nèi)存容量
    (Guava Cache是單個(gè)應(yīng)用運(yùn)行時(shí)的本地緩存嘲玫。它不把數(shù)據(jù)存放到文件或外部服務(wù)器悦施。如果這不符合你的需求,請(qǐng)嘗試Memcached去团、Redis這類(lèi)工具)
注:如果你不需要Cache中的特性抡诞,使用ConcurrentHashMap有更好的內(nèi)存效率

如何使用

pom依賴

<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>20.0</version>
</dependency>

Cache

示例:

Cache<String, String> cache = CacheBuilder.newBuilder()
            .maximumSize(2)
            .expireAfterWrite(10, TimeUnit.SECONDS)
            .build();
    cache.put("a","a");
    String a = cache.getIfPresent("a");
    Thread.sleep(10000);
    String a2 = cache.getIfPresent("a");
    System.out.println(a);
    System.out.println(a2);

結(jié)果:

 a
 null

LoadCache

示例2:

  //模擬數(shù)據(jù)源
  public static  ConcurrentHashMap<String, String> map=new ConcurrentHashMap<String, String>();
{
    map.put("a", "a");
    map.put("v", "v");
    map.put("b", "b");
    map.put("d", "d");
    map.put("f", "f");
    map.put("e", "e");
}

@Test
void createGuavaLoadCache() throws Exception{
    LoadingCache<String, String> loadingCache = CacheBuilder.newBuilder()
            .maximumSize(2)
            .expireAfterWrite(10, TimeUnit.SECONDS)
            .build(new CacheLoader<String, String>() {
                @Override
                public String load(String s) throws Exception {
                    System.out.println("從源數(shù)據(jù)加載:"+s);
                    String s1 = map.get(s);
                    return StringUtils.isBlank(s1) ? "" : s1;//Q1.注:此處需判空,不能返回null土陪,會(huì)報(bào)錯(cuò) 
                }
            });

   String a = loadingCache.get("a");
    System.out.println(a);
    a = loadingCache.get("a");
    System.out.println("測(cè)試本地緩存讀取:"+a);
    String b = loadingCache.get("b");
    System.out.println(b);
    String c = loadingCache.get("c");
    System.out.println(c);
    c = loadingCache.get("c");
    System.out.println(c);
    //測(cè)試最大容量
    a = loadingCache.get("a");
    System.out.println("測(cè)試最大容量,從源數(shù)據(jù)讀取:"+a);
    Thread.sleep(10000);
    //測(cè)試過(guò)期回收
    String a2 = loadingCache.get("a");
    System.out.println("測(cè)試過(guò)期回收,從源數(shù)據(jù)讀取:"+a2);
}

運(yùn)行結(jié)果:

 com.google.common.cache.CacheLoader$InvalidCacheLoadException: CacheLoader returned null for key c.

拋出異常昼汗,原因是讀取"c"時(shí)沒(méi)有值,從CacheLoader加載源數(shù)據(jù)到本地緩存返回為null鬼雀,所以我們需要在CacheLoader的load方法里增加空判斷( Q1處),不能返回null顷窒。

增加判空后:

從源數(shù)據(jù)加載:a
a
測(cè)試本地緩存讀取:a
從源數(shù)據(jù)加載:b
b
從源數(shù)據(jù)加載:c


從源數(shù)據(jù)加載:a
測(cè)試最大容量,從源數(shù)據(jù)讀取:a
從源數(shù)據(jù)加載:a
測(cè)試過(guò)期回收,從源數(shù)據(jù)讀取:a
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市源哩,隨后出現(xiàn)的幾起案子鞋吉,更是在濱河造成了極大的恐慌,老刑警劉巖励烦,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谓着,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡坛掠,警方通過(guò)查閱死者的電腦和手機(jī)赊锚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)治筒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人改抡,你說(shuō)我怎么就攤上這事矢炼。” “怎么了阿纤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)夷陋。 經(jīng)常有香客問(wèn)我欠拾,道長(zhǎng),這世上最難降的妖魔是什么骗绕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任藐窄,我火速辦了婚禮,結(jié)果婚禮上酬土,老公的妹妹穿的比我還像新娘荆忍。我一直安慰自己,他們只是感情好撤缴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布刹枉。 她就那樣靜靜地躺著,像睡著了一般屈呕。 火紅的嫁衣襯著肌膚如雪微宝。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天虎眨,我揣著相機(jī)與錄音蟋软,去河邊找鬼。 笑死嗽桩,一個(gè)胖子當(dāng)著我的面吹牛岳守,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碌冶,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼湿痢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了种樱?” 一聲冷哼從身側(cè)響起蒙袍,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嫩挤,沒(méi)想到半個(gè)月后害幅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岂昭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年以现,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡邑遏,死狀恐怖佣赖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情记盒,我是刑警寧澤憎蛤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站纪吮,受9級(jí)特大地震影響俩檬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碾盟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一棚辽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冰肴,春花似錦屈藐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至骡尽,卻和暖如春遣妥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背攀细。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工箫踩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谭贪。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓境钟,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親俭识。 傳聞我的和親對(duì)象是個(gè)殘疾皇子慨削,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 緩存 范例 適用性 緩存在很多場(chǎng)景下都是相當(dāng)有用的。例如套媚,計(jì)算或檢索一個(gè)值的代價(jià)很高缚态,并且對(duì)同樣的輸入需要不止一次...
    小雞在路上閱讀 3,235評(píng)論 0 2
  • 范例 適用性 緩存在很多場(chǎng)景下都是相當(dāng)有用的。例如堤瘤,計(jì)算或檢索一個(gè)值的代價(jià)很高玫芦,并且對(duì)同樣的輸入需要不止一次獲取值...
    愛(ài)情小傻蛋閱讀 653評(píng)論 0 2
  • com.google.common.cache 1、背景 緩存本辐,在我們?nèi)粘i_(kāi)發(fā)中是必不可少的一種解決性能問(wèn)題的方法...
    拾壹北閱讀 22,298評(píng)論 0 25
  • 什么時(shí)候使用Cache 計(jì)算或檢索一個(gè)值的代價(jià)很高桥帆,或者是讀多寫(xiě)少的場(chǎng)景医增,就應(yīng)當(dāng)考慮使用緩存。 什么時(shí)候使用Gua...
    驪驊閱讀 7,327評(píng)論 0 4
  • 今天青石的票圈出鏡率最高的菊卷,莫過(guò)于張藝謀的新片終于定檔了缔恳。 一張滿溢著水墨風(fēng)的海報(bào)一次次的出現(xiàn)在票圈里,也就是老謀...
    青石電影閱讀 10,330評(píng)論 1 2