Redis 的高效能快取機制的三類問題:快取擊穿、快取雪崩 和 快取穿透

若-飞發表於2024-11-28

1. 快取擊穿

含義

快取擊穿是指某個 熱點資料 恰好在快取過期後,大量請求直接訪問資料庫,導致資料庫壓力驟增。

典型場景

  • 某些資料是高頻訪問的熱點資料,比如搶購活動中熱門商品的庫存。
  • 由於該資料快取時間到期,在快取中失效,瞬間大量請求湧向資料庫。

解決方案

  1. 熱點資料提前續期

    • 在快取接近失效時間時,使用 非同步執行緒自動重新整理策略 提前更新快取。
  2. 加互斥鎖(快取重建保護)

    • 當某一執行緒發現快取失效時,透過加鎖機制(如分散式鎖),確保只有一個執行緒能夠去查詢資料庫並更新快取,其他執行緒等待。
  3. 永不過期策略

    • 對熱點資料設定為永不過期,只透過後臺非同步更新。

2. 快取雪崩

含義

快取雪崩是指在某一時間段內,大量快取同時失效,導致大量請求直接湧向資料庫,可能引發資料庫崩潰。

典型場景

  • 系統中快取的大量資料設定了相同或接近的過期時間。
  • 當這些快取同時到期時,請求繞過快取直接訪問資料庫。

解決方案

  1. 快取過期時間分散

    • 設定快取的過期時間時,使用隨機化策略(如 ExpireTime + rand(5min)),避免同時失效。
  2. 快取預熱

    • 在系統啟動或高峰期前,提前將熱點資料載入到快取中。
  3. 請求限流與降級

    • 實現限流機制,限制突發流量對資料庫的衝擊。
    • 在高峰期返回預設值或靜態資料(如返回空資料或本地快取)。
  4. 多級快取架構

    • 在 Redis 前增加一級快取(如本地快取或 L1 快取),分散資料庫壓力。

3. 快取穿透

含義

快取穿透是指請求的資料在快取和資料庫中都不存在,導致所有請求直接訪問資料庫。

典型場景

  • 使用者請求的資料 key 不存在,例如隨機的 ID 或惡意構造的無效請求。
  • 由於快取中沒有這類 key,請求直接穿透到資料庫。

解決方案

  1. 快取空值

    • 當請求的 key 不存在時,將空結果快取起來,並設定較短的過期時間,避免重複查詢。
  2. 布隆過濾器

    • 使用布隆過濾器在入口處快速判斷 key 是否可能存在,不存在的直接攔截。
  3. 引數校驗

    • 對請求引數進行校驗,過濾無效或異常的請求。
  4. 限流與訪問策略

    • 針對異常高頻的請求,進行限流或 IP 黑名單處理。

總結對比

問題 原因 影響 解決方法
快取擊穿 熱點資料過期,大量請求同時訪問資料庫 單個熱點資料,資料庫壓力驟增 加鎖保護、提前續期、設定永不過期
快取雪崩 大量快取同時失效,所有請求直接訪問資料庫 資料庫崩潰或響應延遲 分散過期時間、快取預熱、限流降級、多級快取
快取穿透 請求的資料在快取和資料庫中都不存在,導致每次請求都查詢資料庫 資料庫壓力持續增加 快取空值、布隆過濾器、引數校驗、限流

這些問題的解決思路,往往是結合多種方法根據業務場景定製化實現的。在面試中,補充實際經驗或程式碼示例,會更具說服力。

相關文章