您好,登錄后才能下訂單哦!
Redis緩存穿透是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
一、緩存穿透(擊穿)
原理:緩存穿透(擊穿)是指查詢一個一定不存在的數據,由于緩存是不命中時被動寫的,并且出于容錯考慮,如果從存儲層查不到數據則不寫入緩存,這將導致這個不存在的數據每次請求都要到存儲層去查詢,失去了緩存的意義。在流量大時,數據庫的壓力驟增(可能會宕機)。
解決方法:
1. 布隆過濾器
對所有可能查詢的參數以hash形式存儲,在控制層先進行校驗,不符合則丟棄。還有最常見的則是采用布隆過濾器,將所有可能存在的數據哈希到一個足夠大的bitmap中,一個一定不存在的數據會被這個bitmap攔截掉,從而避免了對底層存儲系統的查詢壓力。
2. 緩存空對象
如果一個查詢返回的數據為空(無論是數據不存在,還是系統故障),我們仍然把這個空結果進行緩存,但它的過期時間會很短,最長不超過五分鐘。
第一,空值做了緩存,意味著緩存層中存了更多的鍵,需要更多的內存空間 ( 如果是攻擊,問題更嚴重 ),比較有效的方法是針對這類數據設置一個較短的過期時間(最長不超過五分鐘),讓其自動剔除。
第二,緩存層和存儲層的數據會有一段時間窗口的不一致,可能會對業務有一定影響。例如過期時間設置為 5分鐘,如果此時存儲層添加了這個數據,那此段時間就會出現緩存層和存儲層數據的不一致,此時可以利用消息系統或者其他方式清除掉緩存層中的空對象。
二、緩存雪崩
原理:緩存雪崩是緩存時集中在某一時段同時失效,請求全部轉發到數據庫,數據庫瞬時壓力過重導致雪崩效應。
解決方法:
1. 加鎖排隊
在緩存失效后,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。比如對某個key只允許一個線程查詢數據和寫緩存,其他線程等待。
2. 緩存時間增加隨機值
在原有的失效時間基礎上增加一個隨機值,比如1-5分鐘隨機,這樣每一個緩存的過期時間的重復率就會降低,就很難引發集體失效的事件。
三、緩存預熱
新的緩存系統沒有任何緩存數據,在緩存重建數據的過程中,系統性能和數據庫負載都不太好,所以最好是在系統上線之前就把要緩存的熱點數據加載到緩存中,這種緩存預加載手段就是緩存預熱。
四、緩存熱備
緩存熱備即當一臺緩存服務器不可用時能實時切換到備用緩存服務器,不影響緩存使用。集群模式下,每個主節點都會有一個或多個從節點來當備用,一旦主節點掛點,從節點立即充當主節點使用。
看完上述內容,你們掌握Redis緩存穿透是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。