緩存擊穿、緩存穿透和緩存雪崩


 

關於緩存,或者關於微服務,有很多的術語

比如微服務的熔斷,服務降級,服務雪崩

之所以出現需要熔斷或降級,大多情況是並發太高了,服務器扛不住了,或者服務器就是不能長時間運行

除了微服務,還有緩存的一些術語,擊穿,雪崩

 

緩存擊穿 

定義: 緩存中的key一般設有過期時間,如果某個key過期了,恰在這個時候,有大量的並發請求訪問這個key,則這些請求都會到達DB,導致DB瞬間壓力過大,壓垮DB。 

解決方案: 1.設置互斥鎖,mutex。當緩存失效時不時立即去訪問數據庫,而是使用緩存工具的操作成功帶返回值的操作,比如redis的setnx(set if not exit),memcache的add,利用setnx實現鎖的效果。 

缺點:可能造成死鎖,或線程池阻塞 

2.提前使用互斥鎖 

redist的超時時間是timeout1,value的超時時間是timeout2,timeout2 < timeout1。 當timeout2超時時,延長timeout2的時間。並重新設置到redis中。 

3.永遠不過期 

不設置過期時間。 

把過期時間設到value里,如果快要過期了,通過一個后台異步線程進行緩存的構建,也就是邏輯過期。

 

緩存穿透 

定義: 指有人用數據庫中不存在的某個key訪問,數據庫中沒有該key值,自然緩存中也不會有,該請求會直接到數據庫。如果對該key的並發訪問量過大,則會壓垮數據庫。 

解決方案: 

1. 采用過濾器,把所有數據庫中不可能存在的數據hash到一張大的bitmap中,如果key在數據庫中不存在,將會被bitmap攔截。 

2. 對查出為空的key,也在緩存中簡歷key value對,只是過期時間設的短一點,比如5minetes。

 

緩存雪崩 

定義: 指緩存中大量的數據在同一時間失效,這時有大量的請求會被直接轉到數據庫,造成數據庫的壓力過大。 

解決方案:1. 加鎖,加隊列,如mq,保證緩存的單線程寫,避免key失效時,大量並發到達數據庫。 

2.把緩存失效時間錯開。比如在原有失效時間上加一個隨機值,比如1-5分鍾,這樣失效時間的重復率降低,降低集體失效的概率。

 

總結 

緩存雪崩是大量key同時失效事件,而緩存擊穿和緩存穿透都是都是單個key失效,大量請求訪問該key;不同的是緩存擊穿,key對應的value值存在於數據庫中,而緩存穿透的key, value不存在數據庫中,可能被用來惡意攻擊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM