1. 快取擊穿
含義
快取擊穿是指某個 熱點資料 恰好在快取過期後,大量請求直接訪問資料庫,導致資料庫壓力驟增。
典型場景
- 某些資料是高頻訪問的熱點資料,比如搶購活動中熱門商品的庫存。
- 由於該資料快取時間到期,在快取中失效,瞬間大量請求湧向資料庫。
解決方案
-
熱點資料提前續期:
- 在快取接近失效時間時,使用 非同步執行緒 或 自動重新整理策略 提前更新快取。
-
加互斥鎖(快取重建保護):
- 當某一執行緒發現快取失效時,透過加鎖機制(如分散式鎖),確保只有一個執行緒能夠去查詢資料庫並更新快取,其他執行緒等待。
-
永不過期策略:
- 對熱點資料設定為永不過期,只透過後臺非同步更新。
2. 快取雪崩
含義
快取雪崩是指在某一時間段內,大量快取同時失效,導致大量請求直接湧向資料庫,可能引發資料庫崩潰。
典型場景
- 系統中快取的大量資料設定了相同或接近的過期時間。
- 當這些快取同時到期時,請求繞過快取直接訪問資料庫。
解決方案
-
快取過期時間分散:
- 設定快取的過期時間時,使用隨機化策略(如
ExpireTime + rand(5min)
),避免同時失效。
- 設定快取的過期時間時,使用隨機化策略(如
-
快取預熱:
- 在系統啟動或高峰期前,提前將熱點資料載入到快取中。
-
請求限流與降級:
- 實現限流機制,限制突發流量對資料庫的衝擊。
- 在高峰期返回預設值或靜態資料(如返回空資料或本地快取)。
-
多級快取架構:
- 在 Redis 前增加一級快取(如本地快取或 L1 快取),分散資料庫壓力。
3. 快取穿透
含義
快取穿透是指請求的資料在快取和資料庫中都不存在,導致所有請求直接訪問資料庫。
典型場景
- 使用者請求的資料
key
不存在,例如隨機的 ID 或惡意構造的無效請求。 - 由於快取中沒有這類
key
,請求直接穿透到資料庫。
解決方案
-
快取空值:
- 當請求的
key
不存在時,將空結果快取起來,並設定較短的過期時間,避免重複查詢。
- 當請求的
-
布隆過濾器:
- 使用布隆過濾器在入口處快速判斷
key
是否可能存在,不存在的直接攔截。
- 使用布隆過濾器在入口處快速判斷
-
引數校驗:
- 對請求引數進行校驗,過濾無效或異常的請求。
-
限流與訪問策略:
- 針對異常高頻的請求,進行限流或 IP 黑名單處理。
總結對比
問題 | 原因 | 影響 | 解決方法 |
---|---|---|---|
快取擊穿 | 熱點資料過期,大量請求同時訪問資料庫 | 單個熱點資料,資料庫壓力驟增 | 加鎖保護、提前續期、設定永不過期 |
快取雪崩 | 大量快取同時失效,所有請求直接訪問資料庫 | 資料庫崩潰或響應延遲 | 分散過期時間、快取預熱、限流降級、多級快取 |
快取穿透 | 請求的資料在快取和資料庫中都不存在,導致每次請求都查詢資料庫 | 資料庫壓力持續增加 | 快取空值、布隆過濾器、引數校驗、限流 |
這些問題的解決思路,往往是結合多種方法根據業務場景定製化實現的。在面試中,補充實際經驗或程式碼示例,會更具說服力。