redis的雪崩與穿透原理的淺理解
首先列一下主要說什麽,
1、什麽是Redis緩存的雪崩?
2、什麽是Redis緩存的穿透?
3、Redis緩存崩潰會怎麽樣?
4、怎麽預防Redis緩存崩潰?
1、什麽是Redis緩存的雪崩?
舉個栗子:有系統A,每天高峰期每秒有5000個請求,緩存機抗4000,數據庫最大閾值抗2000,本來系統緩存機可以抗住4000個請求,但是系統緩存機突然死翹翹宕機了,也就是緩存掛了。這個時候來的5000個請求全部砸到了數據庫,遠超數據庫的可承受範圍。數據庫也可是傻眼了於是乎就業跟著掛了,系統本身也沒有預制應急方案,沒辦法系統沒有優質方案解決,重啟數據庫又不能有效解決,因為重啟後又馬上被幹死了。當遇到這個場景的時候我就可以理解為緩存的雪崩。
2、緩存雪崩的解決發案
事前:Redis高可用,主從+哨兵。避免全盤崩潰。
哨兵的作用:
1、監控redis進行狀態,包括master和slave
2、當master down機,能自動將slave切換成master
看到上邊的作用,大概就知道怎麽個原理了吧。可以配置多個或者一個主從。同時也可以配置多個哨兵。盡量做到有備份的效果。
緩存往往都設置有失效時間,在設置的時候需要註意避免大量緩存同時失效。可以設置緩存的有效期在某一個隨機的有效期內,同時失效也在隨機的一個有效期內。
具體的配置暫不說明,先把原理搞清楚了,在去實操鞏固,實操部分後續補充。
事中:本地ehcache緩存+hystrix限流&降級。避免數據庫被打死。
大致理解如下:系統接受到請求後先查本地ehcache再查Redis,如果都沒有則再去查數據庫,並同時將相關數據重新寫入Redis和本地緩存中。避免下次再去請求時再訪問數據庫。
同時可以設置限流降級,當請求數大於系統所能夠處理的請求數時,通過限流組件起到超出的部分走降級,不進行處理,確保系統核心功能一直處於可用狀態。
事後:Redis做持久化處理,一旦重啟,自動從磁盤上加載數據,快速恢復緩存數據。
2、什麽是Redis緩存的穿透?
還是舉個栗子:對於系統A,假設高峰期一秒有5000個請求需要處理,結果其中4000個請求是惡意攻擊所發出的。那麽這4000個請求在緩存中查不到並且數據中也查不到。比如數據庫存儲的數據ID範圍是1~500 ,而實際查詢完全不在這個範圍內。這樣就導致每次查詢的命中率為0.。這種場景就可以被理解為緩存穿透。
對此應該怎麽解決呢?可以采用一種簡單的方式,每次系統A從數據庫中要是沒有查到就寫一個空值到緩存,或者將查詢進行標記,下次將接受的請求進行標記比對,最終要實現出現重復的或者沒有空值均走緩存進行處理。
redis的雪崩與穿透原理的淺理解