你需要知道的緩存擊穿/穿透/雪崩

緩存擊穿/穿透/雪崩

Intro

使用緩存需要了解幾個緩存問題,緩存擊穿、緩存穿透以及緩存雪崩,需要了解它們產(chǎn)生的原因以及怎么避免,尤其是當你打算設(shè)計自己的緩存框架的時候需要考慮如何處理這些問題。

緩存擊穿

一般的緩存系統(tǒng),都是按照 key 去緩存查詢,如果不存在對應(yīng)的 value ,就應(yīng)該去后端系統(tǒng)查找(比如數(shù)據(jù)庫)。如果 key 對應(yīng)的 value 是一定不存在的,并且對該 key 并發(fā)請求量很大,就會對后端系統(tǒng)就會造成很大的壓力。

在高并發(fā)下,多線程同時查詢同一個資源,如果緩存中沒有這個資源,那么這些線程都會去后端服務(wù)或數(shù)據(jù)庫查找,對數(shù)據(jù)庫造成極大壓力,緩存也就失去存在的意義。

緩存擊穿解決方案

導致緩存擊穿的問題在于高并發(fā)多線程情景下,許多請求一下子都到后端服務(wù)和數(shù)據(jù)庫,導致后端服務(wù)與數(shù)據(jù)庫的壓力驟增。

處理這個問題,在多線程請求同一個 key 的時候,進行排隊,這樣第一次請求后端服務(wù)和數(shù)據(jù)庫之后更新緩存的值,下一個請求從緩存中取數(shù)據(jù)的時候就會拿到緩存數(shù)據(jù),不會再請求后端服務(wù)和數(shù)據(jù)庫。

緩存穿透

緩存穿透是指用戶查詢數(shù)據(jù),在數(shù)據(jù)庫沒有,自然在緩存中也不會有。這樣就導致用戶查詢的時候,在緩存中找不到,每次都要去數(shù)據(jù)庫中查詢,從而失去了緩存的意義而且相比直接查詢數(shù)據(jù)庫還增加了每次都去查緩存。

緩存穿透解決方案

導致問題出現(xiàn)的原因在于請求一個不存在的數(shù)據(jù)從而使得緩存始終不存在進而導致后端系統(tǒng)(主要是數(shù)據(jù)庫)要承受很大的壓力,所以想要解決這個問題,就勢必就在緩存這里攔截住大量的請求,使得最終走到后端系統(tǒng),查詢數(shù)據(jù)庫的請求盡可能的少。

一般處理這個問題,緩存不存在的時候會在緩存中設(shè)置一個時間較短的內(nèi)容為空的緩存,從而減少實際請求到后端和進行數(shù)據(jù)庫查詢的次數(shù)。

復雜一些的解決方案有 布隆過濾器,基本原理是設(shè)置一個 list,查詢緩存的時候從 list 里進行判斷,這里不做多介紹。

布隆過濾器(Bloom Filter)是1970年由布隆提出的。它實際上是一個很長的二進制向量和一系列隨機映射函數(shù)。布隆過濾器可以用于檢索一個元素是否在一個集合中。它的優(yōu)點是空間效率和查詢時間都遠遠超過一般的算法,缺點是有一定的誤識別率和刪除困難
如果想要判斷一個元素是不是在一個集合里,一般想到的是將所有元素保存起來,然后通過比較確定。鏈表,樹等等數(shù)據(jù)結(jié)構(gòu)都是這種思路. 但是隨著集合中元素的增加,我們需要的存儲空間越來越大,檢索速度也越來越慢(O(n),O(logn))。不過世界上還有一種叫作散列表(又叫哈希表,Hash table)的數(shù)據(jù)結(jié)構(gòu)。它可以通過一個Hash函數(shù)將一個元素映射成一個位陣列(Bit array)中的一個點。這樣一來,我們只要看看這個點是不是1就可以知道集合中有沒有它了。這就是布隆過濾器的基本思想。

緩存雪崩

當緩存服務(wù)器重啟或者大量緩存集中在某一個時間失效,這樣在失效的時候,也會給后端系統(tǒng)和數(shù)據(jù)庫帶來很大壓力.

緩存雪崩解決方案

導致出現(xiàn)緩存雪崩的根本原因在于緩存大量失效,從而導致大量請求沒有命中緩存,大量請求走到后端服務(wù)和數(shù)據(jù)庫,造成壓力。

如果系統(tǒng)啟動就依賴很多緩存,那可以通過其它服務(wù)進行緩存預(yù)熱,提前把需要的數(shù)據(jù)放到緩存中,避免系統(tǒng)啟動大量請求直接請求到后端服務(wù)和數(shù)據(jù)庫。

既然是由于同一時間緩存大量失效,我們也可以著手從緩存的失效時間上,做一些優(yōu)化,讓緩存不要在同一時間點失效。
具體的實施辦法,你可以在設(shè)置失效時間的時候隨機加幾秒過期時間,避免同一時間點緩存大量失效。

Reference

Contact

Contact me: weihanli@outlook.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容