來自未來的緩存 Caffeine,帶你揭開它的神秘面紗

2020-12-13 騰訊網

作者 | Garnett

頭圖 | CSDN 下載自東方IC

caffeine是什麼,它和redis什麼區別,有哪些作用,那麼讓我們帶著疑問讓Garnett來告訴你這個來自未來的緩存-Caffeine!

Caffeine和Redis的區別是什麼?

1、相同點:

兩個都是緩存的方式

2、不同點:

redis是將數據存儲到內存裡

caffeine是將數據存儲在本地應用裡

caffeine和redis相比,沒有了網絡IO上的消耗

3、聯繫:

一般將兩者結合起來,形成一二級緩存。使用流程大致如下:

去一級緩存中查找數據(caffeine-本地應用內)

如果沒有的話,去二級緩存中查找數據(redis-內存)

再沒有,再去資料庫中查找數據(資料庫-磁碟)

到這裡大家應該清楚了其實redis和caffeine都是緩存,但是他們並不相同,所以別混淆了!

那麼什麼是 Caffeine

1、Caffeine簡介

Caffeine是基於jdk 1.8 Version的高性能緩存庫。Caffeine提供的內存緩存使用參考Google guava的API。Caffeine是基於Google Guava Cache設計經驗上改進的成果。

Caffeine是使用jdk 1.8對Guava cache的重寫版本,基於LRU算法實現,支持多種緩存過期策略。

那麼先來看看Caffeine和其他的進程緩存的區別,為什麼叫它來自未來的緩存呢?

2、其他進程緩存的簡單介紹

Google Guava工具包中的一個非常方便易用的本地化緩存實現,基於LRU算法實現,支持多種緩存過期策略。

EhCache 是一個純Java的進程內緩存框架,具有快速、精幹等特點,是Hibernate中默認的CacheProvider。

3、性能比較

場景1:8個線程讀,100%的讀操作

場景二:6個線程讀,2個線程寫,也就是75%的讀操作,25%的寫操作

場景三:8個線程寫,100%的寫操作

可以清楚的看到Caffeine效率明顯的高於其他緩存。

4、如何使用

5、參數方法

initialCapacity(1) 初始緩存長度為1

maximumSize(100) 最大長度為100

expireAfterWrite(1, TimeUnit.DAYS) 設置緩存策略在1天未寫入過期緩存

Caffeine的原理

1、W-TinyLFU

既然說到了淘汰策略,那麼就簡單說說redis的吧

繼續說Caffeine的淘汰策略

傳統的LFU受時間周期的影響比較大。所以各種LFU的變種出現了,基於時間周期進行衰減,或者在最近某個時間段內的頻率。同樣的LFU也會使用額外空間記錄每一個數據訪問的頻率,即使數據沒有在緩存中也需要記錄,所以需要維護的額外空間很大。

可以試想我們對這個維護空間建立一個hashMap,每個數據項都會存在這個hashMap中,當數據量特別大的時候,這個hashMap也會特別大。

再回到LRU,我們的LRU也不是那麼一無是處,LRU可以很好的應對突發流量的情況,因為他不需要累計數據頻率。

所以W-TinyLFU結合了LRU和LFU,以及其他的算法的一些特點。

為了改進上述 LRU 和 LFU 存在的問題,前Google工程師在 TinyLfu的基礎上發明了 W-TinyLFU 緩存算法。Caffine 就是基於此算法開發的。

Caffeine 因使用 Window TinyLfu 回收策略,提供了一個近乎最佳的命中率。

TinyLFU維護了近期訪問記錄的頻率信息,作為一個過濾器,當新記錄來時,只有滿足TinyLFU要求的記錄才可以被插入緩存。

TinyLFU藉助了數據流Sketching技術,它可以用小得多的空間存放頻次信息。TinyLFU採用了一種基於滑動窗口的時間衰減設計機制,藉助於一種簡易的 reset 操作:每次添加一條記錄到Sketch的時候,都會給一個計數器上加 1,當計數器達到一個尺寸 W 的時候,把所有記錄的 Sketch 數值都除以 2,該 reset 操作可以起到衰減的作用 。

W-TinyLFU主要用來解決一些稀疏的突發訪問元素。在一些數目很少但突發訪問量很大的場景下,TinyLFU將無法保存這類元素,因為它們無法在給定時間內積累到足夠高的頻率。因此 W-TinyLFU 就是結合 LFU 和LRU,前者用來應對大多數場景,而 LRU 用來處理突發流量。

在處理頻次記錄方面,採用 Bloom Filter,對於每個key,用 n 個 byte 每個存儲一個標誌用來判斷 key 是否在集合中。原理就是使用 k 個 hash 函數來將 key 散列成一個整數。

在 W-TinyLFU 中使用 Count-Min Sketch 記錄 key 的訪問頻次,而它就是布隆過濾器的一個變種。

2、讀寫性能

在guava cache中我們說過其讀寫操作中夾雜著過期時間的處理,也就是你在一次Put操作中有可能還會做淘汰操作,所以其讀寫性能會受到一定影響,可以看上面的圖中,caffeine的確在讀寫操作上面完爆guava cache。主要是因為在caffeine,對這些事件的操作是通過異步操作,他將事件提交至隊列,這裡的隊列的數據結構是RingBuffer。然後會通過默認的ForkJoinPool.commonPool(),或者自己配置線程池,進行取隊列操作,然後在進行後續的淘汰,過期操作。

當然讀寫也是有不同的隊列,在caffeine中認為緩存讀比寫多很多,所以對於寫操作是所有線程共享一個Ringbuffer。

對於讀操作比寫操作更加頻繁,進一步減少競爭,其為每個線程配備了一個RingBuffer:

3、數據淘汰策略

在caffeine所有的數據都在ConcurrentHashMap中,這個和guava cache不同,guava cache是自己實現了個類似ConcurrentHashMap的結構。在caffeine中有三個記錄引用的LRU隊列:

Eden隊列:在caffeine中規定只能為緩存容量的%1,如果size=100,那這個隊列的有效大小就等於1。這個隊列中記錄的是新到的數據,防止突發流量由於之前沒有訪問頻率,而導致被淘汰。比如有一部新劇上線,在最開始其實是沒有訪問頻率的,防止上線之後被其他緩存淘汰出去,而加入這個區域。伊甸區,最舒服最安逸的區域,在這裡很難被其他數據淘汰。

Probation隊列:叫做緩刑隊列,在這個隊列就代表你的數據相對比較冷,馬上就要被淘汰了。這個有效大小為size減去eden減去protected。

Protected隊列:在這個隊列中,可以稍微放心一下了,你暫時不會被淘汰,但是別急,如果Probation隊列沒有數據了或者Protected數據滿了,你也將會被面臨淘汰的尷尬局面。當然想要變成這個隊列,需要把Probation訪問一次之後,就會提升為Protected隊列。這個有效大小為(size減去eden) X 80% 如果size =100,就會是79。

這三個隊列關係如下:

所有的新數據都會進入Eden。

Eden滿了,淘汰進入Probation。

如果在Probation中訪問了其中某個數據,則這個數據升級為Protected。

如果Protected滿了又會繼續降級為Probation。

對於發生數據淘汰的時候,會從Probation中進行淘汰。會把這個隊列中的數據隊頭稱為受害者,這個隊頭肯定是最早進入的,按照LRU隊列的算法的話那他其實他就應該被淘汰,但是在這裡只能叫他受害者,這個隊列是緩刑隊列,代表馬上要給他行刑了。這裡會取出隊尾叫候選者,也叫攻擊者。這裡受害者會和攻擊者PK決出我們應該被淘汰的。

通過我們的Count-Min Sketch中的記錄的頻率數據有以下幾個判斷:

如果攻擊者大於受害者,那麼受害者就直接被淘汰。

如果攻擊者

他認為設置一個預熱的門檻會讓整體命中率更高。

其他情況,隨機淘汰。

Caffeine功能剖析

1、轉瞬即逝-過期策略

在Caffeine中分為兩種緩存,一個是有界緩存,一個是無界緩存,無界緩存不需要過期並且沒有界限。在有界緩存中提供了三個過期API:

expireAfterWrite:代表著寫了之後多久過期。(上面列子就是這種方式)

expireAfterAccess:代表著最後一次訪問了之後多久過期。

expireAfter:在expireAfter中需要自己實現Expiry接口,這個接口支持create,update,以及access了之後多久過期。注意這個API和前面兩個API是互斥的。這裡和前面兩個API不同的是,需要你告訴緩存框架,他應該在具體的某個時間過期,也就是通過前面的重寫create,update,以及access的方法,獲取具體的過期時間。

2、除舊布新-更新策略

何為更新策略?就是在設定多長時間後會自動刷新緩存。

Caffeine提供了refreshAfterWrite()方法來讓我們進行寫後多久更新策略:

上面的代碼我們需要建立一個CacheLodaer來進行刷新,這裡是同步進行的,可以通過buildAsync方法進行異步構建。在實際業務中這裡可以把我們代碼中的mapper傳入進去,進行數據源的刷新。

但是實際使用中,你設置了一天刷新,但是一天後你發現緩存並沒有刷新。這是因為必有在1天後這個緩存再次訪問才能刷新,如果沒人訪問,那麼永遠也不會刷新。你明白了嗎?

我們來看看自動刷新他是怎麼做的呢?自動刷新只存在讀操作之後,也就是我們afterRead()這個方法,其中有個方法叫refreshIfNeeded,他會根據你是同步還是異步然後進行刷新處理。

3、知己知彼-打點監控

在Caffeine中提供了一些的打點監控策略,通過recordStats()Api進行開啟,默認是使用Caffeine自帶的,也可以自己進行實現。在StatsCounter接口中,定義了需要打點的方法目前來說有如下幾個:

recordHits:記錄緩存命中

recordMisses:記錄緩存未命中

recordLoadSuccess:記錄加載成功(指的是CacheLoader加載成功)

recordLoadFailure:記錄加載失敗

recordEviction:記錄淘汰數據

通過上面的監聽,我們可以實時監控緩存當前的狀態,以評估緩存的健康程度以及緩存命中率等,方便後續調整參數。

4、有始有終-淘汰監聽

有很多時候我們需要知道Caffeine中的緩存為什麼被淘汰了呢,從而進行一些優化?這個時候我們就需要一個監聽器,代碼如下所示:

在Caffeine中被淘汰的原因有很多種:

EXPLICIT: 這個原因是,用戶造成的,通過調用remove方法從而進行刪除。

REPLACED: 更新的時候,其實相當於把老的value給刪了。

COLLECTED: 用於我們的垃圾收集器,也就是我們上面減少的軟引用,弱引用。

EXPIRED:過期淘汰。

SIZE: 大小淘汰,當超過最大的時候就會進行淘汰。

當我們進行淘汰的時候就會進行回調,我們可以列印出日誌,對數據淘汰進行實時監控。

相關焦點

  • Caffeine 和 Redis 居然可以這麼搭,想不到吧!
    作者 | Garnett來源 | Garnett的Java之路(ID:gh_009246af52d4)頭圖 | CSDN 下載自東方IC前言各位可以回顧下上篇來自未來的緩存-Caffeine,帶你揭開它的神秘面紗在之前我們介紹了如何使用 Redis 或者
  • 翡翠龍牌造型霸氣,帶你揭開它的神秘面紗!
    龍一直以來都是中華民族的圖騰,在中國有著非常高的人氣,龍在中國也是有著非常多的神話故事,翡翠龍牌背後也蘊藏著非常多的美好寓意,現在我們就來揭開翡翠龍牌霸氣造型背後的神秘面紗!2、自古中國就有望子成龍的說法,因此龍也是優秀的象徵,它也可以助佩戴者可以做成一番事業、前途順暢、事業如虹。3、傳說龍在民間能夠諒解百姓之苦,更是有著呼風喚雨的能耐,可以為平民老百姓解決燃眉之急,使得老百姓風調雨順,寓意著大獲豐收、五穀豐登。
  • 《探秘冬蟲夏草》——揭開冬蟲夏草的神秘面紗
    《探秘冬蟲夏草》——揭開冬蟲夏草的神秘面紗 2020-12-11 12:44 來源:澎湃新聞·澎湃號·政務
  • 揭開硅藻土的「神秘面紗」...
    了解硅藻泥的人都知道,硅藻泥的原材料取自硅藻礦物,也就是我們常聽到的硅藻土,而硅藻泥的強大功能性也與其成分硅藻土有著莫大的聯繫,而今,你所不知道的是,硅藻土小小的身體裡還隱藏著巨大能量,美容護膚、生活用品、人造皮革、動物飼料、建築壁材都有它的身影....今日,小編就帶你揭開硅藻土的「神秘面紗」...
  • 帶你揭開黑枸杞的神秘面紗
    但它真的有這麼神奇麼?今天就來為大家揭開它的神秘面紗。 黑枸杞,又稱「黑果枸杞」、「墨果枸杞」、「蘇枸杞」等,來自茄科枸杞屬多荊刺灌木。是目前市面上非常熱門的養身保健品之一。給枸杞主要分布在西藏、青海、寧夏、甘肅、內蒙等地,是我國西部特有的沙漠藥用植物品種,在中亞、歐洲高加索地區也有少量分布。雖然黑枸杞是近幾年才逐漸開始成為熱門的保健品,但是其在少數民族中已作為藥物使用多年。
  • 古代墓葬文化:帶你揭開懸棺葬的神秘面紗!
    一說起懸棺葬,不少人對它的印象是:神秘!尤其是近幾年《盜墓筆記》等類似題材的電視劇盛行,使得一些傳統墓葬文化變得玄之又玄,一提起古墓有關的詞,就讓人倍感神秘,甚至望而生畏。棺材的形式也不是單一的,它的形式比較豐富,例如福建地區崇安武夷山的白巖和觀音巖,當地懸棺葬的棺材形狀和船一樣,用整塊木鑿刻成舟狀,統稱「船棺」。「船棺」也只是一種,棺材的材質上也有區別,比如用陶瓷的,用竹蓆的,甚至還有用麻袋布袋來作為懸棺葬葬具的。關於懸棺葬,最早出現在哪個時代?按照考古資料來分析,目前懸棺葬最早出現的時期應該是商周時期。
  • 帶你揭開石墨的神秘面紗
    你所熟知的石墨,大概就是黑黑的、軟硬適中的鉛筆芯了,哦對了,高中物理也告訴過你電池裡面也有石墨。其實,早在3 000年多年前商代就有用石墨書寫的文字。中國發現和利用石墨的歷史悠久,《水經注》就載有「洛水側有石墨山。
  • 總體規劃出爐揭開南京板橋新城未來20年神秘「面紗」
    在板橋新城交通、商業配套等利好逐步兌現的同時,《南京市板橋新城總體規劃(2010-2030)》、《雨花臺區板橋新城東北組團、中部組團、南部組團控制性詳細規劃(修編)》等規劃的陸續出爐,描繪出了板橋新城未來發展藍圖,也給區域發展增添了更多信心。
  • 一文帶你深扒ClassLoader內核,揭開它的神秘面紗!
    前言ClassLoader 可以說是 Java 最為神秘的功能之一了,好像大家都知道怎麼回事兒 ,又都說不清楚具體是怎麼一回事 。今天,我們就來深度扒一扒,揭開它神秘的面紗!Part 1. 類加載是做什麼的?
  • 揭開首飾製作的神秘面紗
    每個人都是獨立的個體首飾的誕生是一種情感的表達小編帶大家來揭開神秘面紗1
  • 揭開神秘面紗,原來你是這樣的梵淨山
    揭開神秘面紗,原來你是這樣的梵淨山 冬遊貴州 別忘了來銅仁 看看梵淨山的「盛世美顏」 我在梵淨山下等你
  • 風靡一時的束腰到底效果如何,我們一起揭開它的神秘面紗
    很多女性再追求美的同時,也變得無所不用其極,最近束腰在網絡上火爆了起來,美女們為了視覺上的美觀,不少人都開始購買使用,那麼我們今天就來揭開束腰這個神秘的面紗。束腰的廣告宣傳壓縮脂肪,收緊腰腹商家會告訴你,帶上束腰可以壓縮脂肪,有減肥效果。其實仔細品一品就會想明白,脂肪能壓縮嗎?如果脂肪能壓縮,那還需要我們辛苦地去鍛鍊幹什麼?
  • 揭開乳酪麵包的神秘面紗
    點擊LEE烘焙美學關注此公眾號更多精彩內容敬請關注↑揭開乳酪麵包的神秘面紗5.烤出來一定是漂亮的大圓,待冷卻後不要客氣橫堅兩刀,分成四份,每一小塊從中切兩刀,然後夾上你喜歡的口味,比如巧克力、奶油餡等等,然後兩側可以均勻塗上奶酪餡,並撒上糖粉和奶粉,開吃吧!!!錦簇的鮮花在蛋糕中搖曳,幸福的甜蜜爬滿了蛋糕。這裡有記載甜蜜的回憶,也有過往瞬間凝結的感動。
  • 資深臺灣茶專家 大連揭開東方美人神秘面紗
    資深臺灣茶專家 大連揭開東方美人神秘面紗 2015年09月08日 08:56:53  來源:中國臺灣網   中國臺灣網9月7日大連訊
  • 一起來揭開它的神秘面紗
    一起來揭開它的神秘面紗自從某明星推薦了一款益生菌產品之後,身邊好多人都成了「益生軍」,盲目跟風可是不對的哦~今天就帶大家一起來看一下,益生菌到底有什麼奇特之處。首先我們來了解一下,什麼是益生菌?簡單來說,它是一種對人體有益的菌。益生菌有什麼作用和功效呢?很多人一提起益生菌,就覺得只適合便秘、腹瀉的人,這其實是片面的。其實,益生菌的作用遠遠不止這些。
  • 看完這部緩存進化史,還不懂緩存,請給我差評
    這個時候你肯定會好奇為啥這麼caffeine這麼牛逼呢?別著急下面慢慢給你道來。哪怕我這個緩存的容量是1,因為Lfu的規則我必須全部記錄這個100個數據的訪問頻率。如果有更多的數據我就有記錄更多的。在Count-Min Sketch中,我這裡直接說caffeine中的實現吧(在FrequencySketch這個類中),如果你的緩存大小是100,他會生成一個long數組大小是和100最接近的2的冪的數,也就是128。而這個數組將會記錄我們的訪問頻率。在caffei
  • 高清:廣州南越王宮揭開神秘面紗【2】
    點擊下載圖片 人民網5月7日電 「五一」節起,位於廣州老城區鬧市中心的南越王宮博物館伴隨新增南漢二號館宮殿基址的開放而揭開其神秘的面紗。
  • 《法醫秦明》系列網大定檔 三部曲揭開神秘面紗
    《法醫秦明之致命小說》作為《法醫秦明》系列網大三部曲之一,神秘面紗即將揭開。 定檔海報疑竇重生 神秘小說兇殺案初漏端倪《法醫秦明之致命小說》依然以龍番市為故事背景,主要講述了龍番市接二連三的命案與網上連載的某懸疑小說殺人手法如出一轍,秦明(鄧飛 飾)發現小說以「五毒心——貪、嗔、痴、慢、疑」為藍本作案,當所有線索指向秦明高中同學方池(馮粒 飾)的同時,秦明的初戀韓月(楊紫彤 飾)似乎也將受到危險,而秦明與方池對質後發現事情並沒有這麼簡單.....
  • 《又見平遙》沙瓦劇場揭開神秘面紗
    1月20日上午,我國第一部以城文化為主題的室內情景體驗劇——《又見平遙》沙瓦劇場在平遙古城舉行落成典禮,揭開了神秘的面紗。  《又見平遙》劇場分A、B、C、D四個實景演藝區。A區為引導區,仿照平遙古城內經典鋪面建造,真實反映平遙最鼎盛時期票號建築的特色。
  • Jboot v3.5.2 發布,默認緩存由 ehcache 修改為 caffeine
    3、基於 Dubbo 或 Motan 的 RPC 實現 4、基於 Sentinel 的分布式限流和降級 5、基於 Apollo 和 Nacos 的分布式配置中心 6、基於 EhCache 和 Redis 的分布式二級緩存Jboot v3.5.2  更新內容如下: