1. 物理不過期(Physical Non-Expiration)
- 定義:在Redis中不設置
EXPIRE
時間,緩存鍵永久存在(除非主動刪除或內存淘汰)。 - 目的:徹底規避因緩存自動過期導致的擊穿(單熱點失效)和雪崩(多鍵集中失效)。
- 數據示例:
SET user:1001:profile "{\"name\":\"Alice\",\"last_update\":1690000000}" # 不設置TTL
2. 邏輯過期(Logical Expiration)
-
定義:在緩存值的元數據中嵌入過期時間戳,業務層自行判斷數據新鮮度。
-
實現方式:
{"data": "真實業務數據","expire_time": 1690003600 // 邏輯過期時間戳 }
-
觸發更新條件:
- 定時任務掃描:后臺線程周期性檢查邏輯過期時間,主動更新臨近過期的數據。
- 被動觸發更新:當業務請求發現數據邏輯過期時,觸發異步更新(需結合降級策略)。
3. 后臺異步更新(Background Update)
- 技術實現:
- 獨立線程池:與主業務線程隔離,避免更新操作阻塞正常請求。
- 雙緩沖機制:更新時生成新緩存副本,原子替換舊數據,避免臟讀。
- 流程圖:
業務請求 → 讀取緩存 → 判斷邏輯過期 → 否 → 返回數據↓是發起到消息隊列 → 后臺Worker消費 → 更新DB → 刷新緩存
二、邏輯過期解決緩存擊穿的實踐
1. 緩存擊穿(Cache Breakdown)
- 傳統問題場景:熱點Key突然失效,瞬時高并發請求穿透至數據庫。
- 本方案優勢:
- 無物理失效:熱點Key永不自動刪除,直接避免擊穿觸發條件。
- 邏輯更新異步化:即使業務認為數據過期,更新操作由后臺線程異步處理,前端請求無需等待,降級返回稍舊數據或進入隊列等待。