redis是一種快取工具,可以大大減少對資料庫訪問時資料庫的壓力,同時也可以讓我們在對資料的讀取時更方便,但由於某些因素,redis也可能會存在雪崩、擊穿和穿透的風險:
(引用自https://blog.csdn.net/wangxuanyang_zer/article/details/134420084)
1、雪崩:是指在某一時間內大量的快取失效或者過期,同時又有大量的請求進來,這就會導致大量的請求落在資料庫上,引起系統得到崩潰,解決方案如下:
對快取進行時間的設定,如逐級失效或隨機失效,避免同一時間大量的快取失效;引入限流或者熔斷機制,避免同一時間大量請求。
2、擊穿:某個熱點的key值在短時間的失效期間,有大量請求落在資料庫上,引起資料庫壓力過大,導致資料庫被擊垮,(涉及到高併發)
(1)、設定熱點key值永不失效,但是由於記憶體和熱點過多、易過時的原因,不太現實;
(2)、加鎖,java鎖無法鎖住叢集,用分散式鎖,假如有大量請求來,如果key值失效,然後往redis的setnx設定一個值,表示這是一個鎖,此時只需要一個執行緒去資料庫讀取,別的程序sleep一會兒,等查詢後再進行查詢,但是會出現死鎖的問題,要對鎖進行時間設定,超過時間自動釋放,,多執行緒進行。當然這只是單節點的redis,如果多節點的redis,就要用到主從哨兵。
3、穿透:是指在查詢時,redis裡沒有資料,資料庫裡也沒有資料,
設定一個null值,但是由於記憶體的問題,可以為其設定時間,或者使用布隆過濾器,