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


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

redis常被用於作為后台數據庫的緩存,緩存一些熱點訪問數據,根據局部性原理,緩存能夠處理大部分請求。當請求數據未命中緩存時,才會引起對數據庫的訪問。

使用redis作為緩存時,存在一些應用問題,包括緩存穿透、緩存擊穿、緩存雪崩。

image

緩存穿透

當有大量查詢請求未命中緩存時,引起對后台數據庫的頻繁訪問,導致數據庫負載壓力增大,這種現象就叫做緩存穿透。

引起的原因:

  • 黑客大量訪問不存在的key,導致數據庫處理大量請求

解決方法:

  • 將無效的key存進Redis中,若果數據庫查詢某個key不存在時,同樣將這個key緩存到Redis緩存中,並設置value為NULL,表示不存在。如果攻擊請求的key每次都相同,該方法有效;如果攻擊請求的key每次隨機生成,則同樣會產生緩存穿透問題。
  • 使用布隆過濾器,過濾掉一些不存在的key。布隆過濾器判定為true時,key可能存在於數據庫中,也可能不存在;判定為false時,key一定不存在於數據庫。

image

緩存擊穿

當Redis中存在某些極熱點數據時,即有大量請求並發訪問的key-value數據。當極熱點key-value數據突然失效時,緩存未命中引起對后台數據庫的頻繁訪問,這種現象叫緩存擊穿。

引起的原因

  • 緩存上極熱點數據突然失效

解決方法

  • 對極熱點key設置永不過期
  • 使用互斥鎖。如果緩存失效的情況,只有拿到鎖才可以查詢數據庫,降低了在同一時刻訪問數據庫的請求量,防止數據庫崩潰。缺點是會導致系統的性能變差。

image

緩存雪崩

當某⼀時刻發⽣⼤規模的緩存失效的情況,例如緩存服務宕機、大量key在同一時間過期,這樣的后果就是⼤量的請求進來直接打到DB上,可能導致整個系統的崩潰,稱為雪崩。如果運維重啟宕機的數據庫,馬上又會有大量新的請求流量到來,再次引起數據庫宕機。

可能的原因

  • redis宕機、重啟
  • 大量數據使用了同一過期時間

解決方法

  • 引入隨機性,在原有緩存失效時間上加上一個隨機值,避免大量數據在同一時間失效。
  • 通過請求限流、熔斷機制、服務降級等手段,降低服務器負載。
  • 實現緩存組件的高可用,防止單點故障、機器故障、機房宕機等一系列問題。
  • 提高數據后台數據庫的容災能力。

image

參考

十分鍾徹底掌握緩存擊穿、緩存穿透、緩存雪崩_mb5fdb099dd338a的技術博客_51CTO博客


免責聲明!

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



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