1. 程式人生 > >【Redis深入】快取雪崩與熱點key的重建

【Redis深入】快取雪崩與熱點key的重建

快取穿透

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開發與運維》—付磊,張益軍