Redis緩存穿透、緩存擊穿緩存雪崩
redis常被用於作為后台數據庫的緩存,緩存一些熱點訪問數據,根據局部性原理,緩存能夠處理大部分請求。當請求數據未命中緩存時,才會引起對數據庫的訪問。
使用redis作為緩存時,存在一些應用問題,包括緩存穿透、緩存擊穿、緩存雪崩。
緩存穿透
當有大量查詢請求未命中緩存時,引起對后台數據庫的頻繁訪問,導致數據庫負載壓力增大,這種現象就叫做緩存穿透。
引起的原因:
- 黑客大量訪問不存在的key,導致數據庫處理大量請求
解決方法:
- 將無效的key存進Redis中,若果數據庫查詢某個key不存在時,同樣將這個key緩存到Redis緩存中,並設置value為NULL,表示不存在。如果攻擊請求的key每次都相同,該方法有效;如果攻擊請求的key每次隨機生成,則同樣會產生緩存穿透問題。
- 使用布隆過濾器,過濾掉一些不存在的key。布隆過濾器判定為true時,key可能存在於數據庫中,也可能不存在;判定為false時,key一定不存在於數據庫。
緩存擊穿
當Redis中存在某些極熱點數據時,即有大量請求並發訪問的key-value數據。當極熱點key-value數據突然失效時,緩存未命中引起對后台數據庫的頻繁訪問,這種現象叫緩存擊穿。
引起的原因
- 緩存上極熱點數據突然失效
解決方法
- 對極熱點key設置永不過期
- 使用互斥鎖。如果緩存失效的情況,只有拿到鎖才可以查詢數據庫,降低了在同一時刻訪問數據庫的請求量,防止數據庫崩潰。缺點是會導致系統的性能變差。
緩存雪崩
當某⼀時刻發⽣⼤規模的緩存失效的情況,例如緩存服務宕機、大量key在同一時間過期,這樣的后果就是⼤量的請求進來直接打到DB上,可能導致整個系統的崩潰,稱為雪崩。如果運維重啟宕機的數據庫,馬上又會有大量新的請求流量到來,再次引起數據庫宕機。
可能的原因
- redis宕機、重啟
- 大量數據使用了同一過期時間
解決方法
- 引入隨機性,在原有緩存失效時間上加上一個隨機值,避免大量數據在同一時間失效。
- 通過請求限流、熔斷機制、服務降級等手段,降低服務器負載。
- 實現緩存組件的高可用,防止單點故障、機器故障、機房宕機等一系列問題。
- 提高數據后台數據庫的容災能力。