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

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

緩存穿透

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

解決方案

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

緩存雪崩

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

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

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

解決方案

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

參考資料

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章