Redis 緩存如何出錯(cuò)?
緩存系統(tǒng)如何出錯(cuò)?
下圖顯示了緩存可能出錯(cuò)的 4 種典型情況及其解決方案。

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































