場景——Redis
一、Redis緩存穿透、雪崩、擊穿,如何解決?
1 緩存穿透:“查無此物”
概念:客戶端請求的數據在緩存中和數據庫中都不存在,這樣緩存永遠不會生效,這些請求都會打到數據庫;
原因:
- 數據未設置緩存
- 惡意攻擊
方案:
- 布隆過濾器:預加載所有的 Redis KEY 到布隆過濾器中,查詢時先判斷數據是否存在;
優點:速度快,占內存低;
缺點:存在誤判,優化方案- 增加 bitmap 位數長度
- 增加 hash 函數的個數
-
空值緩存:將查詢結果為空的鍵也存入緩存,設置較短過期時間(如5分鐘);
優點:實現簡單;
缺點:可能緩存大量無效Key;
2 緩存雪崩:“集體罷工”
概念:大量 KEY 同時失效,請求直接打到數據庫;
原因:
- 批量過期:大量 Key 設置相同 TTL,同時失效;
- Redis 宕機:集群故障導致所有請求壓到數據庫;
方案:
- 隨機過期時間:大批量的 KEY 設置隨機的過期時間;
缺點:無法應對 Redis 宕機; - 多級緩存架構:本地緩存 -> 分布式緩存
3 緩存擊穿
概念:熱點 KEY 突然失效,大量請求直接打到數據庫;
方案:
- 分布式鎖:當緩存失效時,通過分布式鎖(Redisson)控制僅一個線程重建緩存;
優點:強一致性;
缺點:加鎖時,請求阻塞,影響性能; - 邏輯過期時間:Redis 緩存永不過期,但存儲數據時附加邏輯過期時間;(如定義一個類時,加上一個過期時間的字段,查詢時判斷該字段)

浙公網安備 33010602011771號