一、緩存雪崩
緩存雪崩我們可以簡單理解爲:由於原來緩存失效(比如我們設置緩存時採用了相同的過期時間,在同一時刻出現大面積的緩存過期),新緩存未到,原來應該訪問緩存的請求都跑去查詢數據庫,而對數據庫CPU和內存造成巨大壓力,嚴重的會造成系統宕機,從而形成一系列連鎖反應,造成整個系統崩潰。
緩存雪崩對系統的衝擊是非常大的,可以使用隊列解決此問題。避免緩存失效時大量的併發請求落到底層系統上。還有一個解決方案是將緩存失效時間分開,避免大量緩存同時失效。
二、緩存穿透
緩存穿透是指用戶查詢數據時,在緩存中沒有,在數據庫中也沒有。這樣就導致用戶在查詢數據的時候,在緩存中找不到,在數據庫中再找一遍,相當於兩次無用的查詢。
有很多方法可以有效的解決緩存穿透問題,最常見的則是布隆過濾器。將所有可能的數據哈希到一個足夠大的bitmap中,一個一定不存在的數據會被bitmap攔截掉,從而避免了對底層存儲系統的查詢壓力。
三、緩存預熱
緩存預熱就是在系統上線後,將數據庫中的數據加載到緩存系統。這樣就避免了用戶在查詢數據的時候,先查詢緩存,再訪問數據庫的情況。
解決思路:
- 數據量不大,可以在項目啓動的時候自動進行加載
- 定時刷新緩存
四、緩存更新
除了緩存服務器自帶的緩存失效策略之外(Redis默認的有6種可供選擇),我們還可以根據需要自定義緩存淘汰系統。
五、緩存降級
當訪問量劇增,服務出現問題或非核心服務影響到核心服務時,要進行緩存降級,保證核心服務可用,即使是有損服務。