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

2022-06-06 06:27:06 字數 865 閱讀 4443

認識

快取穿透是指查詢乙個一定不存在的資料,由於快取是不命中時需要從資料庫查詢,查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到資料庫去查詢,造成快取穿透。

解決辦法:

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

也可以採用乙個更為簡單粗暴的方法,如果乙個查詢返回的資料為空(不管是數 據不存在,還是系統故障),我們仍然把這個空結果進行快取,但它的過期時間會很短,最長不超過五分鐘。

認識

如果快取集中在一段時間內失效,發生大量的快取穿透,所有的查詢都落在資料庫上,造成了快取雪崩。

這個沒有完美解決辦法,但可以分析使用者行為,盡量讓失效時間點均勻分布。大多數系統設計者考慮用加鎖或者佇列的方式保證快取的單執行緒(程序)寫,從而避免失效時大量的併發請求落到底層儲存系統上。

解決方法

在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。比如對某個key只允許乙個執行緒查詢資料和寫快取,其他執行緒等待。

可以通過快取reload機制,預先去更新快取,再即將發生大併發訪問前手動觸發載入快取

不同的key,設定不同的過期時間,讓快取失效的時間點盡量均勻

做二級快取,或者雙快取策略。a1為原始快取,a2為拷貝快取,a1失效時,可以訪問a2,a1快取失效時間設定為短期,a2設定為長期。

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

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

Redis快取穿透和快取雪崩

了解過redis的人都知道,在執行讀操作 查詢等 的時候會先從快取中讀取,快取中沒有的話再去資料庫中查詢。如下圖 概念 使用者想要查詢乙個資料,發現redis快取中沒有,也就是快取沒有命中,於是向持久層資料庫查詢。發現也沒有,於是本次查詢失敗。當使用者很多的時候,快取都沒有命中 如秒殺 於是都去請求...

redis 快取擊穿和快取穿透

布隆過濾器 快取擊穿 總結有很多使用者,請求介面。為了防止mysql壓力過大,在訪問量很大且資料變動不頻繁的情況下,我們通過增加redis快取減少mysql的壓力。正常的流程為下圖所示。redis中無資料,從mysql中查詢 mysqlserver mysqli connect 127.0.0.1 ...