Redis快取穿透/擊穿/雪崩
阿新 • • 發佈:2021-01-12
Redis快取穿透/擊穿/雪崩
考慮一個簡單的場景,只有MySQL資料庫和Redis在存放資料,然後使用者發起查詢請求,然後又下面幾個問題。
快取穿透/擊穿
- 快取穿透: 使用者請求的資料在redis快取裡頭和MySQL都沒有,當大量使用者併發請求,MySQL壓力過大,容易奔潰。
- 快取擊穿:redis快取裡頭某個熱點key失效時,大量使用者併發請求直接來到MySQL資料庫上,MySQL壓力過大,容易奔潰。
快取雪崩
當redis快取中大部分key在某個時間內集體失效了(或者redis宕機了),大量使用者併發請求直接來到MySQL資料庫上,MySQL壓力過大,容易奔潰。
解決方案
通用解決方案
- 介面增加使用者鑑權,一些熱點介面甚至需要考慮一下是否需要設定同個使用者某段時間內的訪問次數。
快取穿透解決方案
- 快取和資料庫中都沒有取到資料後,可以將key-value對寫為key-null,注意控制好快取時間,太長可能影響業務的正常進行。
- 增加布隆過濾器,通過資料預熱將可能涉及到的資料以hash方式進行儲存,這樣可以過濾部分無效請求。
快取擊穿解決方案
- 根據其含義,可以考慮設定熱點資料永遠不過期。
- 加互斥鎖。
快取雪崩解決方案
- 暴力的解決方法,設定所有key不過期(注意記憶體使用情況)
- 隨機化快取資料的過期時間
- 如果redis進行叢集部署,儘量將資料均勻分佈(考慮一致性hash演算法)