博客專欄

EEPW首頁 > 博客 > Redis緩存異常及解決方案

Redis緩存異常及解決方案

發(fā)布人:天翼云開發(fā)者 時間:2024-08-19 來源:工程師 發(fā)布文章

本文分享自天翼云開發(fā)者社區(qū)《Redis緩存異常及解決方案》,作者:l****n

本文向讀者解釋了Redis使用過程中,數(shù)據(jù)不一致、緩存雪崩、緩存擊穿和緩存穿透等問題的定義,并給出對應(yīng)的解決方案。

1、數(shù)據(jù)不一致 

一致指的是

緩存中有數(shù)據(jù),那么,緩存的數(shù)據(jù)值需要和數(shù)據(jù)庫中的值相同;

緩存中本身沒有數(shù)據(jù),那么,數(shù)據(jù)庫中的值必須是最新值。

不一致如何發(fā)生

對于讀寫緩存來說,寫緩存時同步寫數(shù)據(jù)庫,需要使用事務(wù)保證緩存和數(shù)據(jù)庫的更新具有原子性。弱一致性情況下,可以使用異步寫回。

對于只讀緩存,刪改數(shù)據(jù)需要既更新數(shù)據(jù)庫,又刪除緩存。如果不使用事務(wù),就會出現(xiàn)數(shù)據(jù)不一致。

比如先更新數(shù)據(jù)庫,再刪除緩存。更新成功,刪除緩存失敗,則緩存中為舊值。如果先刪除緩存再更新數(shù)據(jù)庫,則緩存刪除成功,數(shù)據(jù)庫更新失敗,再訪問數(shù)據(jù)庫,數(shù)據(jù)庫還是舊值。

解決方案

需要重試機制,當(dāng)兩個操作任意一個失敗時,重新執(zhí)行。

特別的,當(dāng)數(shù)據(jù)庫更新成功,緩存刪除也成功時,其實也有可能不一致。比如刪除了緩存,還未更新數(shù)據(jù)庫。線程B此時讀取數(shù)據(jù)庫中舊值并寫到緩存。

解決方法:延遲雙刪。sleep是為了等B線程執(zhí)行完寫緩存操作。sleep時間根據(jù)讀數(shù)據(jù)和寫緩存時間來估算。

  redis.delKey(X)

  db.update(X)

  Thread.sleep(N)

  redis.delKey(X)

比如更新了數(shù)據(jù)庫,還未刪除緩存時。B線程就開始讀數(shù)據(jù),從緩存讀到舊值。不過這種情況下緩存會馬上被刪除,所以影響較小。


2、緩存雪崩

大量請求無法在redis得到處理,從而打到數(shù)據(jù)庫。主要原因:

緩存中大量數(shù)據(jù)同時過期,應(yīng)用訪問時無法命中緩存,從而都請求到數(shù)據(jù)庫;

redis宕機。

解決方案

過期時間增加隨機數(shù);

發(fā)生雪崩時進行服務(wù)降級。非核心數(shù)據(jù)直接返回默認(rèn)值或錯誤;

限流熔斷,當(dāng)數(shù)據(jù)庫負(fù)載突升時,暫停業(yè)務(wù)應(yīng)用對緩存的訪問。


3、緩存擊穿

熱點數(shù)據(jù)過期失效,大量請求突然打到數(shù)據(jù)庫。

解決方法

熱點數(shù)據(jù)不設(shè)置過期時間。


4、緩存穿透

數(shù)據(jù)不在緩存中,也不在數(shù)據(jù)庫中??赡茉颍?/span>

業(yè)務(wù)層誤操作,刪除了數(shù)據(jù)庫數(shù)據(jù)。

惡意攻擊。

解決方案

緩存默認(rèn)值;

使用布隆過濾器快速判斷數(shù)據(jù)是否存在;

前端進行請求檢查。


在實際的業(yè)務(wù)中,以上異常場景可能會同時出現(xiàn),排查時要根據(jù)自己的情況進行針對性分析。

*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



關(guān)鍵詞: Redis 緩存

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉