Java微服務:緩存穿透和緩存雪崩
緩存穿透
緩存是對數據庫的一道保護牆,緩存穿透就是衝破了我們的保護牆。即調用方傳來的永遠都是我們緩存中不存在的Key,這樣每次都需要去數據庫中查詢一次,當大量這樣的請求過來時,瞬時數據庫的壓力會很大,相當於沒用到緩存,同時還增加了去緩存中查找數據的時間,這就是所謂的緩存穿透。
解決方案
- 將該Key緩存下來,以便下次走緩存。但是惡意估計下,Key肯定不固定,該方案沒用。
- 根據Key的規則做一些過濾,判斷Key的合法性,不合法直接返回默認值。這種方案可以解決一部分問題,使用場景較少。
- 通過布隆過濾器實現對緩存的校驗。
緩存雪崩
緩存雪崩指的是,大量緩存同一時間失效,這樣所有的請求都會直接去查詢數據庫,導致數據庫壓力過大,然後掛掉的情況。
注:緩存穿透也可以導致緩存雪崩的發生,但是根本原因不一樣,所以兩個概念不能混用!
緩存雪崩樂觀情況下是存儲層能抗住,但是用戶體驗會受到影響,數據返回慢,當壓力過大時會導致存儲層直接掛掉,整個系統直接掛掉。對於要做到99.99%高可用的產品,是絕對不允許出現緩存雪崩的現象。
解決方案
- 緩存存儲高可用,比如Redis集羣。
- 緩存失效時間設置好,避免同一時間失效。
- 熱點數據,定時更新,避免自動失效。
- 服務限流和接口限流。
- 對數據庫查詢做優化,下策爲加鎖,可以避免數據庫掛掉。
參考資料
- 《Spring Cloud微服務 入門、實戰與進階》