緩存穿透(Cache Penetration)
什么是緩存穿透?
緩存穿透是指惡意或無效的請求導致緩存無法命中,從而每個請求都需要訪問數據庫。這可能發生在請求的數據根本不存在于緩存和數據庫中。
緩存穿透解決方案
- 使用布隆過濾器(Bloom Filter):用于過濾掉不存在于數據庫中的請求,從而避免對數據庫的無效訪問。
- 緩存空值(緩存空對象):對于查詢結果為空的情況,仍將空結果緩存,但設置較短的過期時間,避免頻繁的空查詢請求
布隆過濾器優缺點
優點:
- 節省空間:不需要存儲數據本身,只需要存儲數據對應hash比特位
- 時間復雜度低:插入和查找的時間復雜度都為O(k),k為哈希函數的個數
缺點:
- 存在假陽性:布隆過濾器判斷存在,可能出現元素不在集合中;判斷準確率取決于哈希函數的個數
- 不能刪除元素:如果一個元素被刪除,但是卻不能從布隆過濾器中刪除,這也是造成假陽性的原因了
布隆過濾器適用場景
- 爬蟲系統url去重
- 垃圾郵件過濾
- 黑名單
緩存擊穿(Cache Miss)
什么是緩存擊穿?
緩存擊穿是指某個熱點數據失效,而恰好在此時有大量請求同時訪問該數據,導致這些請求都直接訪問數據庫,增加數據庫負載。
解決方案
- 加鎖(Mutex Locking):當緩存失效時,只允許一個請求進入數據庫查詢,其他請求等待查詢結果。這可以通過互斥鎖來實現。
- 設置短期過期時間:對于熱點數據,緩存可以設置較短的過期時間,避免大量請求同時訪問失效的數據。
- 使用異步更新緩存:緩存失效時,不立即從數據庫查詢,而是通過異步任務去查詢并更新緩存,避免同時訪問數據庫。
緩存雪崩(Cache Avalanche)
什么是緩存雪崩?
緩存雪崩是指在某個時間段內,大量緩存失效或同時過期,導致大量請求直接訪問后端數據庫,從而造成數據庫壓力劇增,甚至導致系統崩潰。這通常發生在緩存的失效時間設置過于集中,或者在某種外部因素(如服務器重啟、緩存層故障)影響下。和緩存擊穿不同的是,緩存擊穿指并發查同一條數據,緩存雪崩是不同數據都過期了。
緩存雪崩的解決方案
- 合理分散過期時間:將緩存的過期時間分散開,避免大量緩存在同一時間失效。
- 使用熱點數據預加載:提前加載熱門數據到緩存,降低緩存失效帶來的影響。
- 采用多級緩存:使用多個緩存層,如內存緩存 + 分布式緩存,以減輕單一緩存層失效的影響
緩存預熱
什么是緩存預熱?
緩存預熱就是系統上線后,將相關的緩存數據直接加載到緩存系統,這樣就可以避免在用戶請求的時候,先查詢數據庫,然后再將數據回寫到緩存。
如果不進行預熱, 那么 Redis 初始狀態數據為空,系統上線初期,對于高并發的流量,都會訪問到數據庫中, 對數據庫造成流量的壓力。
緩存預熱的操作方法
- 數據量不大的時候,工程啟動的時候進行加載緩存動作;
- 數據量大的時候,設置一個定時任務腳本,進行緩存的刷新;
- 數據量太大的時候,優先保證熱點數據進行提前加載到緩存。
個人公眾號🐕已經開通了,歡迎關注!