緩存的問題

緩存穿透

參考
緩存穿透是值緩存和數據庫中都沒有數據,而用戶不斷髮起請求,如發起id爲特別大或者不存在的數據。這時的用戶很可能是攻擊者,攻擊會導致數據庫壓力過大。

解決辦法

  • 可以爲這些key在緩存中設置對應的值爲null,後面查詢這個key的時候就不用查詢數據庫了
  • boolem Filter使用不領過濾器,我們把有數據的key都放在布隆過濾器中,每次查詢的時候都先去布隆過濾器中判斷,如果沒有直接返回null

緩存擊穿—大量請求一個key

在高併發的情況下,大量的請求同時查詢同一個key時,此時這個key正好失效了,就會導致同一時間,這些請求都會去查詢數據庫,這樣的現象我們稱爲緩存擊穿

解決辦法
採用分佈式鎖,只有拿到鎖的第一個線程去請求數據庫,然後插入緩存,當然每次拿到鎖的時候都要去查詢一下緩存有沒有

緩存雪崩

緩存在同一時間大面積的失效,所以後面的請求都會落在數據庫上,造成數據庫接受大量的請求而崩掉。

解決辦法

  • 緩存數據的過期時間設置隨機,防止同一時間大量數據過期現象發生
  • 設置熱點數據永不失效
  • 如果緩存數據庫是分佈式部署,將熱點數據均勻分佈子啊不同的緩存數據庫中
  • ehcache本地緩存 + Hystrix限流&降級
    ehcache 本地緩存的目的也是考慮在 Redis Cluster 完全不可用的時候,ehcache 本地緩存還能夠支撐一陣
    使用 Hystrix進行限流 & 降級 ,比如一秒來了5000個請求,我們可以設置假設只能有一秒 2000個請求能通過這個組件,那麼其他剩餘的 3000 請求就會走限流邏輯
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章