Redis 緩存如何出錯?
緩存系統(tǒng)如何出錯?
下圖顯示了緩存可能出錯的 4 種典型情況及其解決方案。
01 雷群問題(Thurder Hurd)
當(dāng)緩存中的大量 key 同時過期時,就會出現(xiàn)這種情況。然后,查詢請求直接沖擊數(shù)據(jù)庫,導(dǎo)致數(shù)據(jù)庫超載。
有兩種方法可以緩解這一問題:
- 避免為 key 設(shè)置相同的過期時間,在配置中添加一個隨機數(shù);
- 只允許核心業(yè)務(wù)數(shù)據(jù)訪問數(shù)據(jù)庫,而在緩存恢復(fù)之前阻止非核心數(shù)據(jù)訪問數(shù)據(jù)庫。
02 緩存滲透(Cache Penetration)
當(dāng)緩存或數(shù)據(jù)庫中不存在 key 時,就會發(fā)生這種情況。應(yīng)用程序無法從數(shù)據(jù)庫中檢索相關(guān)數(shù)據(jù)來更新緩存。這個問題給緩存和數(shù)據(jù)庫都造成了很大的壓力。
要解決這個問題,有兩種建議。
- 為不存在的 key 緩存一個空值,避免對數(shù)據(jù)庫造成沖擊。
- 使用 bloom 過濾器先檢查 key 是否存在,如果 key 不存在,我們就可以避免對數(shù)據(jù)庫的訪問。
03 緩存崩潰(Cache Breakdown)
這與雷群問題類似。它發(fā)生在熱鍵過期時。大量請求會訪問數(shù)據(jù)庫。
解決方案:由于熱鍵占據(jù)了 80% 的查詢量,我們沒有為它們設(shè)置過期時間。
04 緩存崩潰(Cache Crash)
當(dāng)緩存崩潰時,所有請求都會進(jìn)入數(shù)據(jù)庫。
有兩種方法可以解決這個問題。
- 設(shè)置斷路器 (Circuit Breaker),當(dāng)緩存宕機時,應(yīng)用服務(wù)無法訪問緩存或數(shù)據(jù)庫。
- 為高速緩存建立一個集群,以提高高速緩存的可用性。