當數據庫成為瓶頸時,比如高並發、讀多寫少等場景,我們首先會想到的就是利用緩存來提高整個系統的性能。
緩存雖然能夠大大提升整個系統的性能,但同時也引入了更多復雜性。
如果沒有針對緩存進行比較好的處理,某些場景下甚至會導致整個系統崩潰。
這次我們要聊的就是:緩存雪崩。
緩存雪崩
緩存雪崩是指當緩存失效或過期后引起系統性能急劇下降的情況。
當緩存失效或過期被清除后,系統需要再次訪問數據庫,再次進行運算重新生成緩存,這個處理步驟耗時比較長,上百毫秒甚至更長時間。而對於一個高並發的系統來說,幾百毫秒內可能會接到幾百個請求。
由於舊的緩存已經被清除,新的緩存還未生成,並且處理這些請求的線程都不知道另外有一個線程正在生成緩存,所以所有的請求都會去重新生成緩存,都會去訪問數據庫,對數據庫造成巨大的壓力和不必要的性能損耗。
這些對數據庫的訪問壓力又會拖慢整個系統,嚴重的會造成數據庫宕機,形成一系列連鎖反應,造成整個系統崩潰。
解決辦法
緩存雪崩的常用解決方法有兩種:更新鎖機制和后台更新機制。接下來我們詳細了解一下這兩種方法:
更新鎖機制
對緩存更新操作加入鎖的保護,保證只有一個線程能夠進行緩存更新的操作,沒有獲取更新鎖的線程要么等待鎖釋放后重新讀取緩存,要么直接返回空值或者默認值。
對於采用分布式集群的系統,一個系統中可能存在幾十上百台服務器,即使單台服務器只有一個線程更新緩存,但幾十上百台服務器一起算下來也會有幾十上百個線程同時進行緩存更新的操作,同樣存在緩存雪崩的問題。
所以分布式集群的系統要實現更新鎖機制,需要用到分布式鎖,比如:Redis、ZooKeeper等。
后台更新機制
在系統中,由后台線程來進行緩存更新的操作,而不是由業務線程來進行緩存更新的操作,緩存本身的有效期可以設置為永久或者足夠長的時間,后台線程定時進行緩存更新的操作。
后台更新機制不僅適用於單機多線程的場景,也適用於分布式集群的場景,相比更新鎖機制要簡單一些。
后台更新機制還適用於業務剛上線的時候進行緩存預熱。
緩存預熱指系統上線后,將相關的緩存數據直接加載到緩存系統,而不是等待用戶訪問才來觸發緩存加載。
還用一種比較特殊的場景:當緩存系統內存不夠時,會清除一些緩存數據,從緩存被清除到下一次定時更新緩存的這段時間內,業務線程讀取緩存返回空值,而業務線程本身又不會去更新緩存,因此從用戶角度看到就是數據沒有了。
對應上面這種特殊場景,我們可以使用后台更新機制和更新鎖機制結合使用進行避免。
總結
緩存雪崩是指當緩存失效或過期后引起系統性能急劇下降的情況。
常用的解決方法有兩種:更新鎖機制和后台更新機制。
微信公眾號:萬貓學社
微信掃描二維碼
關注后回復「電子書」
獲取12本Java必讀技術書籍

最后,感謝你的點贊和關注,帥氣又美麗。