Java微服務:緩存穿透和緩存雪崩


Java微服務:緩存穿透和緩存雪崩

緩存穿透

  緩存是對數據庫的一道保護牆,緩存穿透就是沖破了我們的保護牆。即調用方傳來的永遠都是我們緩存中不存在的Key,這樣每次都需要去數據庫中查詢一次,當大量這樣的請求過來時,瞬時數據庫的壓力會很大,相當於沒用到緩存,同時還增加了去緩存中查找數據的時間,這就是所謂的緩存穿透。

解決方案

  • 將該Key緩存下來,以便下次走緩存。但是惡意估計下,Key肯定不固定,該方案沒用。
  • 根據Key的規則做一些過濾,判斷Key的合法性,不合法直接返回默認值。這種方案可以解決一部分問題,使用場景較少。
  • 通過布隆過濾器實現對緩存的校驗。

緩存雪崩

  緩存雪崩指的是,大量緩存同一時間失效,這樣所有的請求都會直接去查詢數據庫,導致數據庫壓力過大,然后掛掉的情況。

注:緩存穿透也可以導致緩存雪崩的發生,但是根本原因不一樣,所以兩個概念不能混用!

  緩存雪崩樂觀情況下是存儲層能抗住,但是用戶體驗會受到影響,數據返回慢,當壓力過大時會導致存儲層直接掛掉,整個系統直接掛掉。對於要做到99.99%高可用的產品,是絕對不允許出現緩存雪崩的現象。

解決方案

  • 緩存存儲高可用,比如Redis集群。
  • 緩存失效時間設置好,避免同一時間失效。
  • 熱點數據,定時更新,避免自動失效。
  • 服務限流和接口限流。
  • 對數據庫查詢做優化,下策為加鎖,可以避免數據庫掛掉。

參考資料

  • 《Spring Cloud微服務 入門、實戰與進階》

 


免責聲明!

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



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