Redis系列:快取擊穿.穿透.雪崩(九)

JaksionTang發表於2020-12-15

什麼是熱key嗎?熱key問題怎麼解決?

  • 所謂熱key問題就是,突然有幾十萬的請求去訪問redis上的某個特定key,那麼這樣會造成流量過於集中,達到物理網路卡上限,從而導致這臺redis的伺服器當機引發雪崩
    在這裡插入圖片描述

  • 針對熱key的解決方案:
    (1)提前把熱key打散到不同的伺服器,降低壓力
    (2)加入二級快取,提前載入熱key資料到記憶體中,如果redis當機,走記憶體查詢

快取擊穿

  • 快取擊穿的概念就是單個key併發訪問過高,過期時導致所有請求直接打到db上,這個和熱key的問題比較類似,只是說的點在於過期導致請求全部打到DB上
    在這裡插入圖片描述

  • 解決方案:
    (1)加鎖更新,比如請求查詢A,發現快取中沒有,對A這個key加鎖,同時去資料庫查詢資料,寫入快取,再返回給使用者,這樣後面的請求就可以從快取中拿到資料了
    (2)將過期時間組合寫在value中,通過非同步的方式不斷的重新整理過期時間,防止此類現象

快取穿透

  • 快取穿透是指查詢不存在快取中的資料,每次請求都會打到DB,就像快取不存在一樣
    在這裡插入圖片描述
  • 解決方案
    (1)布隆過濾器:布隆過濾器的原理是在你存入資料的時候,會通過雜湊函式將它對映為一個位陣列中的K個點,同時把他們置為1,這樣當使用者再次來查詢A,而A在布隆過濾器值為0,直接返回,就不會產生擊穿請求打到DB了。
    但是使用布隆過濾器之後會有一個問題就是誤判,因為它本身是一個陣列,可能會有多個值落到同一個位置,那麼理論上來說只要我們的陣列長度夠長,誤判的概率就會越低,這種問題就根據實際情況來就好了。
    (2)快取空物件:當db沒有命中後,及使返回的空物件也快取起來,並且設定一個過期時間,後面就會直接取快取中取,也就不會打到DB上,但是也存在問題,如果空值多了,意味著快取需要更多的空間來儲存這些控制鍵。

快取雪崩

  • 當某一時刻發生大規模的快取失效的情況,比如你的快取服務當機了,會有大量的請求進來直接打到DB上,這樣可能導致整個系統的崩潰,稱為雪崩。雪崩和擊穿、熱key的問題不太一樣的是,他是指大規模的快取都過期失效了(比如淘寶雙11)
    在這裡插入圖片描述
  • 解決方案:
    (1)redis高可用,多增加一些redis裝置,及搭建redis叢集
    (2)針對不同key設定不同的過期時間,避免同時過期
    (3)限流,如果redis當機,可以限流,避免同時刻大量請求打崩DB
    (4)資料預熱,在正式訪問前,預先訪問一邊,把一些高頻的資料預先寫入快取中
    (5)二級快取,同熱key的方案

相關文章