????????在高并發系統中,Redis作為高性能的內存緩存數據庫,緩存可能會引發一系列嚴重問題——緩存雪崩、緩存穿透、緩存擊穿。
一、緩存雪崩(Cache Avalanche)
1. 什么是緩存雪崩?
????????緩存雪崩是指大量緩存數據在同一時間集中失效,導致所有請求直接打到后端數據庫,數據庫瞬間承受巨大壓力,甚至可能被壓垮。
2. 典型場景
緩存服務器宕機或重啟。
大量熱點數據設置了相同的過期時間,同時失效。
Redis集群出現網絡分區或主從切換失敗。
3. 解決方案
設置不同的過期時間
????????避免所有緩存同時失效。可以在基礎過期時間上增加一個隨機值。
多級緩存架構
????????使用 本地緩存 + Redis 的多級緩存策略。即使Redis失效,本地緩存仍可緩解部分壓力。
服務降級與熔斷
????????當數據庫壓力過大時,可臨時返回默認值或友好提示,保護核心服務。
高可用部署
????????Redis使用主從 + 哨兵或Redis Cluster集群模式。
????????數據持久化(RDB+AOF)防止數據丟失。
預熱緩存
????????系統上線或重啟后,提前加載熱點數據到緩存,避免冷啟動時直接沖擊數據庫。
二、緩存穿透
1. 什么是緩存穿透?
????????緩存穿透是指查詢一個數據庫中根本不存在的數據,由于緩存中沒有,每次請求都會穿過緩存直達數據庫,導致數據庫壓力劇增。
2. 攻擊場景
????????惡意用戶或爬蟲頻繁查詢不存在的ID,造成數據庫負載飆升。
3. 解決方案
緩存空值
????????即使查詢結果為空,也緩存一個特殊值(如 null
或 "empty"
),并設置較短過期時間。
布隆過濾器
在訪問緩存前,先通過布隆過濾器判斷數據是否存在。
????????優點:空間效率高,查詢速度快。
????????缺點:存在極低的誤判率(可能把不存在的判為存在),但不會漏判。
接口層校驗
????????對請求參數進行合法性校驗,如ID格式、范圍限制、權限驗證等,提前攔截非法請求。
三、緩存擊穿
1. 什么是緩存擊穿?
????????緩存擊穿是指某個熱點數據在緩存中過期的瞬間,大量并發請求同時涌入,直接訪問數據庫,造成數據庫瞬時壓力激增。
與雪崩的區別:雪崩是大量key同時失效;擊穿是單個熱點key失效。
2. 典型場景
????????突發新聞、秒殺商品、熱門視頻等熱點數據過期。
????????高并發下多個線程同時發現緩存失效,同時查詢數據庫。
3. 解決方案
互斥鎖
????????當緩存失效時,只允許一個線程去加載數據庫,其他線程等待。
邏輯過期
????????不設置Redis的物理過期時間,而是將過期時間作為數據的一部分存儲:
永不過期(慎用)
????????對極端熱點數據設置永不過期,通過后臺任務定期更新緩存。
四、總結
問題 | 觸發條件 | 影響范圍 | 解決方案 |
---|---|---|---|
緩存雪崩 | 大量key同時失效 | 全局性,系統級風險 | 隨機過期時間、多級緩存、高可用 |
緩存穿透 | 查詢不存在的數據 | 針對特定非法請求 | 緩存空值、布隆過濾器、參數校驗 |
緩存擊穿 | 熱點key失效瞬間 | 單個熱點數據 | 互斥鎖、邏輯過期、永不過期 |