【Redis深入】快取雪崩與熱點key的重建
阿新 • • 發佈:2018-12-25
快取穿透
1.定義
快取穿透是指查詢一個根本不存在的資料,快取層和儲存層都不會命中,
快取穿透將導致不存在的資料每次請求都要到儲存層去查詢,失去了快取保護後端儲存的意義。
2.造成快取穿透的原因
業務自身程式碼或者資料出現問題
一些惡意攻擊、爬蟲等造成大量空命中
3.解決方法
快取空物件
- 空值做快取,即快取層中存了更多的鍵,這就需要更多的記憶體空間 ,可以對其設定一個較短的過期時間,讓其自動清除。
- 優點是實時性高,程式碼維護簡單。
布隆過濾器攔截
- 如果布隆過濾器認為某個鍵 不存在,那麼就不會訪問儲存層。
- 適用於資料命中不高,資料相對固定實時性低(通常是資料集較大)的應用場景,程式碼維護較為複雜,但是快取空間佔用少。
快取雪崩
1.定義
由於快取層承載著大量請求,有效的保護了儲存層,但是如果快取層由於某些原因整體不能提供服務,於是所有的請求都會達到儲存層,儲存層的呼叫量會暴增,造成儲存層也會掛掉的情況
2.解決方法
保證快取層服務高可用性
例如Redis Sentinel 和 Redis Cluster 都實現了高可用。賴隔離元件為後端限流並降級
對重要的資源 ( 如 Redis、 MySQL、 Hbase、外部介面 ) 都進行隔離,讓每種資源都單獨執行在自己的執行緒池中。
而Hystrix 是解決依賴隔離的利器
熱點 key 的重建
1.熱點key需要重建的原因
當前 key 是一個熱點 key( 例如一個熱門的娛樂新聞),併發量非常大。
重建快取不能在短時間完成,可能是一個複雜計算,例如複雜的 SQL、多次 IO、多個依賴等。
2.解決思路
減少重建快取的次數
資料儘可能一致
較少的潛在危險
3.解決方法
互斥鎖 (mutex key)
只允許一個執行緒重建快取,其他執行緒等待重建快取的執行緒執行完,重新從快取獲取資料即可
可使用 Redis 的 setnx 命令實現該功能。永遠不過期
物理”不過期:沒有設定過期時間,所以不會出現熱點 key 過期後產生的問題。
為每個 value 設定一個邏輯過期時間,當發現超過邏輯過期時間後,會使用單獨的執行緒去構建快取。
本人才疏學淺,若有錯,請指出,謝謝!
如果你有更好的建議,可以留言我們一起討論,共同進步!
衷心的感謝您能耐心的讀完本篇博文!
參考書籍:《Redis開發與運維》—付磊,張益軍