轉自公眾號: 自強學堂
文中的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 過期時間隨機抖動下。
