緩存穿透、擊穿、雪崩區別和解決方案



轉自公眾號: 自強學堂
文中的cache指緩存,比如redis,db指數據庫,比如mysql。

一、緩存的三種模式

這里主要指的是應用代碼對 cache 和 db 中數據的維護方式。

1.1 應用代碼同時更新 cache 和 db

a)數據寫入流程

b)數據讀取流程

1.2 應用代碼只更新 cache,cache 負責同步更新 db

此時可以將 cache 和 db 看成一個整體,db 自己維護 cache。

1.3 應用方代碼更新緩存,另外將 cache 中數據定期更新到 db


類似於 Linux 文件系統中的 page cache。
這個可能會導致數據不一致,甚至數據丟失。

二、緩存使用要注意的問題

當緩存使用不當時,可能會導致請求瞬間打到db,db 扛不住掛掉。
常見的有以下三種問題。

2.1 緩存穿透

概念說明:指 cache 和 db 中都沒有數據,讀完 cache 沒有,再讀 db 還是沒有,每次請求到 cache 和 db。
解決方法:
a).攔截非法請求,比如不正常的 id 請求直接拒絕。
b).沒有數據時也 cache 下,過期時間可設置短點,不把過多請求打到 db 去。
c).使用 Write Behind Caching 模式,命中不了 cache 不讀取 db。這時需要注意 cache 大小,此時的數據都存在了內容。
d).采用布隆過濾器,不存在的 key 直接過濾;布隆過濾器判斷存在,則數據可能存在,如果判斷不存在,則肯定不存在。
一般建議前兩種,實現起來比較簡單

2.2 緩存擊穿

概念說明:一般是少量熱點數據過期(比如微博熱搜),導致大量請求查 cache 沒有,又查 db。
解決方法:
a)熱點 key 永不過期,異步更新。
b)更新熱點 key 時加鎖,同一個 key 最好只有一個請求打到 db。
c)接口限流,熔斷、降級

2.3 緩存雪崩

概念說明:大量 cache 數據同時過期,導致大量請求打到 db。
解決方法:
a).熱點 key 永不過期,異步更新。
b).防止同時大量數據過期,cache 過期時間隨機抖動下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM