1. 緩存雪崩(Cache Avalanche)
定義:緩存雪崩是指大量緩存中的數據在同一時間過期,導致大量請求同時訪問數據庫,造成數據庫壓力驟增,甚至可能導致數據庫崩潰。
原因:
多個緩存的 key 在同一時間過期;
當這些 key 不再命中緩存時,所有請求都會同時訪問數據庫。
應對策略:
設置過期時間加隨機值:避免緩存的 key 在相同時間過期。比如,如果某個 key 設置過期時間為 1 小時,可以隨機設置在 59 分鐘到 61 分鐘之間。
EXPIRE key 3600
分批過期:不同的數據設置不同的過期時間,避免同一時刻大量緩存失效。
提前加載緩存(緩存預熱):在應用啟動時預加載熱點數據到緩存中,減少初次使用時數據庫的壓力。
2. 緩存穿透(Cache Penetration)
定義:緩存穿透是指查詢一個緩存中和數據庫中都不存在的數據(例如惡意請求或查詢條件錯誤),導致每次請求都訪問數據庫,緩存無法發揮作用。
原因:
用戶查詢的鍵既不在緩存中,也不在數據庫中;
可能是由于客戶端錯誤、惡意攻擊或非法請求。
應對策略:
布隆過濾器(Bloom Filter):布隆過濾器能夠高效地判斷某個數據是否存在于數據庫中。通過在緩存之前進行一次判斷,如果數據不存在,直接返回,不訪問數據庫。布隆過濾器的誤判率很低,但能有效避免不必要的數據庫訪問。
示例:檢查某個ID是否存在于數據庫中,如果不存在,則直接返回“數據不存在”。
if (!bloomFilter.contains(id)) {return null; // 數據不存在,直接返回 }
緩存空值:對于不存在的數據,可以在緩存中設置一個特殊的標記(如空字符串或特定對象),表示此數據為空,這樣后續相同請求會直接返回緩存,不再查詢數據庫。
3. 緩存預熱(Cache Warming)
定義:緩存預熱是指在系統啟動或緩存空置時,提前將熱點數據加載到緩存中,以避免緩存未命中的“冷啟動”問題。
原因:
系統啟動或緩存清空后,第一次查詢可能會直接查詢數據庫,影響性能;
高頻查詢數據可以提前加載到緩存中,避免訪問數據庫。
應對策略:
手動預熱:在系統啟動時,通過腳本或程序將熱點數據加載到緩存中。
public void preLoadCache() {List<String> hotData = database.queryHotData();for (String data : hotData) {redis.set(data);} }
自動預熱:通過定時任務或后臺進程,定期更新緩存內容。
基于訪問頻率預熱:通過日志、監控分析,發現訪問頻率較高的數據,優先加載到緩存。
4. 緩存更新(Cache Update)
定義:緩存更新是指在緩存中的數據發生變化時,如何保證緩存中的數據與數據庫中的數據一致。
問題:
數據庫數據更新后,緩存中的數據可能變得過時;
需要確保數據一致性。
應對策略:
緩存失效(Cache Invalidation):數據更新后,主動刪除緩存中的對應數據,確保下次訪問時重新從數據庫加載并更新緩存。
// 數據更新后清除緩存 redis.del(key);
緩存更新(Cache Update):在數據庫更新后,直接更新緩存中的數據,確保緩存和數據庫中的數據一致。
// 更新數據庫后同步更新緩存 redis.set(key, updatedValue);
雙寫策略(Double Write):更新數據庫的同時,直接更新緩存。這需要確保緩存更新的原子性,否則可能出現緩存與數據庫不一致的情況。
5. 緩存降級(Cache Degradation)
定義:緩存降級是指在緩存服務不可用或緩存故障時,采取的一種策略來降低對數據庫的壓力,并確保系統可以繼續提供服務。
原因:
緩存服務宕機或超時;
緩存中數據不存在或無法訪問。
應對策略:
服務降級:當緩存失效時,可以降級到直接從數據庫中獲取數據。為了避免大量數據庫訪問,可以在數據庫查詢時做限流或熔斷處理。
降級返回默認值:當緩存不可用時,返回默認值或者保留上次的緩存值,而不是直接請求數據庫。
緩存預熱與補償機制:在緩存失敗時,通過后臺異步任務去更新緩存,減少對數據庫的直接訪問。
6. 總結
問題 | 描述 | 應對策略 |
---|---|---|
緩存雪崩 | 多個緩存數據同時過期,導致大量請求直接訪問數據庫,可能崩潰 | 設置過期時間加隨機值、分批過期、提前加載熱點數據(緩存預熱) |
緩存穿透 | 查詢數據既不在緩存中,也不在數據庫中,造成數據庫壓力 | 布隆過濾器、緩存空值 |
緩存預熱 | 系統啟動時,提前加載熱點數據到緩存中,避免冷啟動 | 手動預熱、自動預熱、基于訪問頻率預熱 |
緩存更新 | 數據更新后,保證緩存和數據庫一致性 | 緩存失效、緩存更新、雙寫策略 |
緩存降級 | 緩存不可用時,降級到數據庫查詢或返回默認值,保證系統可用性 | 服務降級、返回默認值、后臺異步任務更新緩存 |