您好,登錄后才能下訂單哦!
redis緩存雪崩和緩存穿透的怎么解決?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
緩存穿透
緩存穿透是指查詢一個一定不存在的數據。由于緩存不命中,并且出于容錯考慮,如果從數據庫查不到數據則不寫入緩存,這將導致這個不存在的數據每次請求都要到數據庫去查詢,失去了緩存的意義。即請求的數據在緩存大量不命中,導致請求走數據庫。
解決方案
布隆過濾
對所有可能查詢的參數以hash形式存儲,在控制層先進行校驗,不符合則丟棄,從而避免了對底層存儲系統的查詢壓力;
緩存空對象
當存儲層不命中后,即使返回的空對象也將其緩存起來,同時會設置一個過期時間,之后再訪問這個數據將會從緩存中獲取,保護了后端數據源;
但是這種方法會存在兩個問題:
如果空值能夠被緩存起來,這就意味著緩存需要更多的空間存儲更多的鍵,因為這當中可能會有很多的空值的鍵;
即使對空值設置了過期時間,還是會存在緩存層和存儲層的數據會有一段時間窗口的不一致,這對于需要保持一致性的業務會有影響。
緩存雪崩
我們都知道Redis不可能把所有的數據都緩存起來(內存昂貴且有限),所以Redis需要對數據設置過期時間,將已經過期的鍵值對刪除,它采用的是惰性刪除+定期刪除兩種策略對過期鍵刪除。
如果緩存數據設置的過期時間是相同的,并且Redis恰好將這部分數據全部刪光了。這就會導致在這段時間內,這些緩存同時失效,全部請求到數據庫中。
Redis掛掉了,請求全部走數據庫。
對緩存數據設置相同的過期時間,導致某段時間內緩存失效,請求全部走數據庫。
解決方案
保證緩存層服務高可用性
即使個別節點、個別機器、甚至是機房宕掉,依然可以提供服務,比如 Redis Sentinel 和 Redis Cluster 都實現了高可用。
依賴隔離組件為后端限流并降級
在緩存失效后,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。比如對某個key只允許一個線程查詢數據和寫緩存,其他線程等待。
數據預熱
可以通過緩存reload機制,預先去更新緩存,再即將發生大并發訪問前手動觸發加載緩存不同的key,設置不同的過期時間,讓緩存失效的時間點盡量均勻。
看完上述內容,你們掌握redis緩存雪崩和緩存穿透的解決方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。