博客專欄

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

        Redis緩存異常及解決方案

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

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

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

        1、數據不一致 

        一致指的是

        緩存中有數據,那么,緩存的數據值需要和數據庫中的值相同;

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

        不一致如何發生

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

        對于只讀緩存,刪改數據需要既更新數據庫,又刪除緩存。如果不使用事務,就會出現數據不一致。

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

        解決方案

        需要重試機制,當兩個操作任意一個失敗時,重新執行。

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

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

          redis.delKey(X)

          db.update(X)

          Thread.sleep(N)

          redis.delKey(X)

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


        2、緩存雪崩

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

        緩存中大量數據同時過期,應用訪問時無法命中緩存,從而都請求到數據庫;

        redis宕機。

        解決方案

        過期時間增加隨機數;

        發生雪崩時進行服務降級。非核心數據直接返回默認值或錯誤;

        限流熔斷,當數據庫負載突升時,暫停業務應用對緩存的訪問。


        3、緩存擊穿

        熱點數據過期失效,大量請求突然打到數據庫。

        解決方法

        熱點數據不設置過期時間。


        4、緩存穿透

        數據不在緩存中,也不在數據庫中。可能原因:

        業務層誤操作,刪除了數據庫數據。

        惡意攻擊。

        解決方案

        緩存默認值;

        使用布隆過濾器快速判斷數據是否存在;

        前端進行請求檢查。


        在實際的業務中,以上異常場景可能會同時出現,排查時要根據自己的情況進行針對性分析。

        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: Redis 緩存

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 前郭尔| 长葛市| 大埔区| 神农架林区| 平度市| 德江县| 新巴尔虎左旗| 自贡市| 日照市| 军事| 长白| 车致| 新巴尔虎左旗| 荃湾区| 奈曼旗| 景德镇市| 尖扎县| 邻水| 都安| 巴林右旗| 浑源县| 昆山市| 江口县| 孟村| 鄯善县| 南木林县| 宣武区| 河源市| 博乐市| 甘孜| 罗山县| 满城县| 基隆市| 平舆县| 甘肃省| 全南县| 徐闻县| 永清县| 福州市| 潜江市| 巴中市|