文章目錄
- 緩存全景圖
- Pre
- 緩存設計中的 7 大經典問題
- 一、緩存失效
- 1. 問題描述
- 2. 原因分析
- 3. 業務場景
- 4. 解決方案
- 二、緩存穿透
- 1. 問題描述
- 2. 原因分析
- 3. 業務場景
- 4. 解決方案
- 緩存空結果
- BloomFilter 過濾
- BloomFilter 原理簡述
- 三、緩存雪崩
- 1. 問題描述
- 2. 原因分析
- 3. 業務場景
- 4. 解決方案
- 四、結語
緩存全景圖
Pre
分布式緩存:緩存設計三大核心思想
分布式緩存:緩存的三種讀寫模式及分類
分布式緩存:緩存架構設計的“四步走”方法
實際上,在緩存系統的設計架構中,還有很多坑, 如果設計不當會導致很多嚴重的后果。設計不當,輕則請求變慢、性能降低,重則會數據不一致、系統可用性降低,甚至會導致緩存雪崩,整個系統無法對外提供服務。
緩存設計中的 7 大經典問題
接下來將對緩存設計中的 7 大經典問題,
首先我們先梳理一下緩存失效、緩存穿透與緩存雪崩。
- 緩存失效:描述、原因、場景、解決方案
- 緩存穿透:描述、原因、場景、解決方案(含 BloomFilter 原理)
- 緩存雪崩:描述、原因、場景、解決方案
一、緩存失效
1. 問題描述
緩存第一個經典問題是緩存失效。上一課時講到,服務系統查數據,首先會查緩存,如果緩存數據不存在,就進一步查 DB,最后查到數據后回種到緩存并返回。緩存的性能比 DB 高
50~100
倍以上,所以我們希望數據查詢盡可能命中緩存,這樣系統負荷最小,性能最佳。緩存里的數據存儲基本上都是以 key 為索引進行存儲和獲取的。業務訪問時,如果大量的 key 同時過期,很多緩存數據訪問都會 miss,進而穿透到 DB,DB 的壓力就會明顯上升,由于 DB 的性能較差,只在緩存的 1%~2% 以下,這樣請求的慢查率會明顯上升。這就是緩存失效的問題。
當大量緩存 key 在同一時刻過期,被同時淘汰后,打到 DB 的請求驟增,數據庫壓力急劇上升,導致請求變慢甚至服務不可用。
2. 原因分析
- 緩存在寫入時通常帶上固定過期時間。
- 一批數據一次性加載到緩存,且使用相同的過期時間,必然在該時間點集中失效。
3. 業務場景
- 火車票、機票開售時批量預加載緩存。
- 微博后臺離線計算完熱門 Feed,一次性回寫緩存。
- 新業務上線或多IDC部署時的緩存預熱。
4. 解決方案
- 過期時間隨機化:
實際過期 = 基礎過期 + 隨機值
,讓同類數據分散在一個窗口內逐步過期,避免雪崩式淘汰。
基礎過期:3600s
隨機范圍:0–300s
最終過期:3600s + rand(0,300s)
二、緩存穿透
1. 問題描述
請求一個不存在的 key,每次都會 Miss 并打到 DB,若惡意或大量無效請求持續觸發,DB 壓力陡增,影響正常服務。
2. 原因分析
設計時只考慮了正常訪問流程(Cache → DB → 回種),未對“查詢空”場景做保護:對 DB 查詢到的空結果不回寫緩存,導致每次都要訪問 DB。
3. 業務場景
- 通過不存在的用戶 ID、車次 ID 訪問系統。
- 惡意或誤操作客戶端批量請求非法 key。
4. 解決方案
緩存空結果
- 第一次查詢 DB 未命中時,回寫一個特殊空值到緩存,并設置短過期時間;
- 若后續仍查詢該 key,則直接命中空值緩存,避免再次穿透。
BloomFilter 過濾
- 預先用 BloomFilter 記錄所有合法 key;
- 查詢時先檢查 BloomFilter,不存在則直接返回,無需查 Cache/DB。
BloomFilter 原理簡述
-
數據結構:一個位數組和 k 個獨立 Hash 函數。
-
添加元素:對 key 做 k 次 Hash,設置對應 bit 位為 1。
-
檢查存在:若 k 個位置都為 1,則“可能存在”;任一位置為 0,則“必定不存在”。
-
特性:
- 空否定 100% 準確;
- 存在判斷有一定誤判率(可通過增加位數組和 Hash 函數數量降至可接受范圍,如 1%→0.1%)。
- 空值緩存與 BloomFilter 可結合使用,兼顧空間與準確率。
三、緩存雪崩
1. 問題描述
部分或大量緩存節點不可用,導致請求集中打到 DB 或重分布時過載,最終引發系統不可用。
- 不支持 Rehash:節點故障后,客戶端訪問失敗→穿透到 DB,DB 過載。
- 支持 Rehash:節點故障后,流量重分發到健康節點,瞬間過載 → 多節點連鎖宕機。
2. 原因分析
- 單點或少量節點故障:未做好副本或限流保護。
- 流量洪峰:熱點 key 在少數節點集中,導致節點崩潰并連鎖擴散。
3. 業務場景
- 部分節點宕機并波及全池。
- 機架斷電引發大量節點脫機,瞬間請求涌向 DB。
4. 解決方案
-
DB 讀寫降級開關
- 監控到 DB 慢查詢率或阻塞率過高時,Failfast 部分/全部讀請求,保護 DB 可用;
- 寫請求保證優先處理,讀請求可根據業務容忍度返回舊值或降級信息。
-
多副本部署
- 同一數據在多副本(機架隔離)上緩存,任一副本失效可從其他副本讀取;
- 副本數根據熱點程度,熱點可配 6–10+ 副本,冷數據可少量雙副本。
-
實時監控與自動故障轉移
- 緩存節點健康、命中率、慢請求比等指標告警;
- 自動剔除異常節點、啟動備用節點、限流降級,確保核心請求穩定處理。
四、結語
緩存系統的 穩定與高效 離不開對這些經典問題的深入理解與預防設計。
- 失效雪崩:隨機化過期、分散淘汰
- 穿透攻防:空值回寫、BloomFilter 過濾
- 雪崩防護:限流降級、多副本、監控與自動化運維