快取失效 穿透和雪崩的處理總結

2021-10-02 16:26:00 字數 694 閱讀 7147

問題描述:

快取第乙個經典問題是快取失效。服務系統查資料、首先會查詢快取,如果快取資料不存在,就進一步查db,最後查到資料後回種到快取並返回。

快取的效能比db高50~100倍以上,所以希望資料在查詢的時候盡可能命中快取,這樣系統符合最小,效能最佳。

快取裡的資料儲存基本上都是以key為索引進行儲存和獲取的。業務訪問的時候,如果大量的key同時過期,很多快取資料訪問都會miss,進而穿透到db,db的壓力就會明顯上公升,由於db的效能較差(快取的1%~2%以下),這樣請求的慢查率會明顯上公升。

原因分析

導致快取失效,特別是很多key一起失效的原因,跟日常寫快取的過期時間息息相關。

在寫快取的時候,會根據業務的訪問特點,給每種業務資料預置乙個過期時間,在寫快取時把這個過期時間帶上,讓快取資料在這個固定的過期時間後被淘汰。

一般情況下,因為快取數量是逐步寫入的,所以也是逐步過期被淘汰的。但在某些場景,一大批資料會被系統主動或被動從db批量載入,然後寫入快取。這些資料寫入快取時,由於使用相同的過期時間,在經歷這個過期時間之後,這批資料就會一起到期,從而被快取淘汰。此時,對這批資料的所有請求,都會出現快取失效,從而都穿透到db,db由於查詢量太大,就很容易壓力大增,請求變慢。

業務場景

在很多的業務場景種,稍不注意,就會出現大量的快取失效

快取失效,穿透,雪崩

快取可以狹義的理解為是擋在db之前的一層資料塊,效能比db高很多倍。服務系統查資料,首先會查快取,如果快取資料不存在,就進一步查 db,最後查到資料後回種到快取並返回。快取裡的資料儲存基本上都是以 key 為索引進行儲存和獲取的。原因 寫快取時一般都會帶上乙個過期時間,讓快取資料在這個固定的過期時間...

快取雪崩 穿透和失效問題

1 快取雪崩 redis 集群徹底崩潰後,大量請求直接打到 mysql 上面,導致 mysql 也崩潰繼而導致源服務乃至整個 崩潰 解決方案 事前 發生快取雪崩之前怎麼防止 redis 掛掉 事中 redis 集群已掛 事後 redis 集群重啟時 2 快取穿透 大量請求在穿過快取直接訪問 redi...

redis快取穿透 雪崩和快取失效的預防和解決

對所有可能查詢的引數以hash形式儲存,在控制層先進行校驗,不符合則丟棄。還有最常見的則是採用布隆過濾器,將所有可能存在的資料雜湊到乙個足夠大的bitmap中,乙個一定不存在的資料會被這個bitmap攔截掉,從而避免了對底層儲存系統的查詢壓力。也可以採用乙個更為簡單粗暴的方法,如果乙個查詢返回的資料...