Redis緩存穿透和緩存雪崩以及解決方案

轉載:https://www.cnblogs.com/George1994/p/10668889.html

緩存穿透

這個很好理解,就是在訪問數據的時候,緩存中沒有對應的數據。接着查詢數據庫也無法查詢出結果,導致不會寫入到緩存中去。這回導致每次查詢都會去請求數據庫,造成緩存穿透;
在這裏插入圖片描述
解決方案

布隆過濾:對所有可能查詢的參數以hash形式存儲,在控制層先進行校驗,不符合則丟棄,從而避免了對底層存儲系統的查詢壓力;
在這裏插入圖片描述
緩存空對象:當存儲層不命中後,即使返回的空對象也將其緩存起來,同時會設置一個過期時間,之後再訪問這個數據將會從緩存中獲取,保護了後端數據源;
在這裏插入圖片描述
但是這種方法會存在兩個問題:
1、如果空值能夠被緩存起來,這就意味着緩存需要更多的空間存儲更多的鍵,因爲這當中可能會有很多的空值的鍵;
2、即使對空值設置了過期時間,還是會存在緩存層和存儲層的數據會有一段時間窗口的不一致,這對於需要保持一致性的業務會有影響。

方案比較:
在這裏插入圖片描述

緩存雪崩

緩存雪崩是指,由於緩存層承擔了大量的請求,有效保護了存儲層,但是如果因爲某些願意整體不能提供服務,於是所有請求都到達了存儲層(也就是數據庫)。存儲層的調用會暴增。造成存儲層直接被帶垮掉。
在這裏插入圖片描述
解決方案

  • 保證緩存層服務高可用性:即使個別節點、個別機器、甚至是機房宕掉,依然可以提供服務,比如 Redis Sentinel 和 Redis Cluster 都實現了高可用。
  • 依賴隔離組件爲後端限流並降級:在緩存失效後,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。比如對某個key只允許一個線程查詢數據和寫緩存,其他線程等待。
  • 數據預熱:可以通過緩存reload機制,預先去更新緩存,再即將發生大併發訪問前手動觸發加載緩存不同的key,設置不同的過期時間,讓緩存失效的時間點儘量均勻。

緩存併發

緩存併發是指,高併發場景下同時大量查詢過期的key值、最後查詢數據庫將緩存結果回寫到緩存、造成數據庫壓力過大

解決方案
分佈式鎖:在緩存更新或者過期的情況下,先獲取鎖,在進行更新或者從數據庫中獲取數據後,再釋放鎖,需要一定的時間等待,就可以從緩存中繼續獲取數據。

發佈了167 篇原創文章 · 獲贊 59 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章