首頁  >  文章  >  後端開發  >  淺談redis的快取穿透和快取失效的預防和解決

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

little bottle
little bottle轉載
2019-04-28 18:03:472792瀏覽

這篇文章是關於redis的快取穿透和快取失效的預防和解決,具有一定的參考價值,有興趣的朋友可以了解一下,希望對你有幫助。

快取穿透:

認識

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

解決方法:

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

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

快取雪崩

認識

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

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

解決方法

在快取失效後,透過加鎖或佇列來控制讀取資料庫寫入快取的執行緒數量。例如對某個key只允許一個線程查詢資料和寫入緩存,其他線程等待。

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

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

做二級緩存,或是雙重緩存策略。 A1為原始緩存,A2為拷貝緩存,A1失效時,可存取A2,A1緩存失效時間設定為短期,A2設定為長期。

相關教學:redis影片教學

#

以上是淺談redis的快取穿透和快取失效的預防和解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除