Redis系列:快取擊穿.穿透.雪崩(九)
阿新 • • 發佈:2020-12-16
什麼是熱key嗎?熱key問題怎麼解決?
-
所謂熱key問題就是,突然有幾十萬的請求去訪問redis上的某個特定key,那麼這樣會造成流量過於集中,達到物理網絡卡上限,從而導致這臺redis的伺服器宕機引發雪崩
-
針對熱key的解決方案:
(1)提前把熱key打散到不同的伺服器,降低壓力
(2)加入二級快取,提前載入熱key資料到記憶體中,如果redis宕機,走記憶體查詢
快取擊穿
-
快取擊穿的概念就是
單個key併發訪問過高
,過期時導致所有請求直接打到db上,這個和熱key的問題比較類似,只是說的點在於過期導致請求全部打到DB上
-
解決方案:
(1)加鎖更新,比如請求查詢A,發現快取中沒有,對A這個key加鎖,同時去資料庫查詢資料,寫入快取,再返回給使用者,這樣後面的請求就可以從快取中拿到資料了
快取穿透
- 快取穿透是指
查詢不存在快取中的資料
,每次請求都會打到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的方案