Categories
程式開發

面試官:講一下緩存穿透、緩存雪崩和緩存擊穿?


原創首發公眾號:「bigsai」

緩存穿透、緩存雪崩和緩存擊穿

如果不了解,可能對這幾個概念都不了解,聽著感覺太高大上,至少筆者剛開始是這麼覺得,本文並不是詳細介紹如何解決和完美解決,更主要的是認識和認知吧。

面試官:講一下緩存穿透、緩存雪崩和緩存擊穿? 1

面試官:講一下緩存穿透、緩存雪崩和緩存擊穿? 2

redis緩存穿透

面試官:講一下緩存穿透、緩存雪崩和緩存擊穿? 3

理解

重在穿透吧,也就是訪問透過redis直接經過mysql,通常是一個不存在的key,在數據庫查詢為null。每次請求落在數據庫、並且高並發。數據庫扛不住會掛掉。

解決方案

可以將查到的null設成該key的緩存對象。當然,也可以根據明顯錯誤的key在邏輯層就就行驗證。同時,你也可以分析用戶行為,是否為故意請求或者爬蟲、攻擊者。針對用戶訪問做限制。其他等等,比如用布隆過濾器(超大型hashmap)先過濾。

redis緩存雪崩

理解

雪崩,就是某東西蜂擁而至的意思,像雪崩一樣。在這裡,就是redis緩存集體大規模集體失效,在高並發情況下突然使得key大規模訪問mysql,使得數據庫崩掉。可以想像下國家人口老年化。以後那天人集中在70-80歲,就沒人幹活了。國家勞動力就造成壓力。

面試官:講一下緩存穿透、緩存雪崩和緩存擊穿? 4

解決方案

通常的解決方案是將key的過期時間後面加上一個隨機數,讓key均勻的失效。考慮用隊列或者鎖讓程序執行在壓力範圍之內,當然這種方案可能會影響並發量。熱點數據可以考慮不失效

redis緩存擊穿

理解

緩存擊穿,是指一個key非常熱點,在不停的扛著大並發,大並發集中對這一個點進行訪問,當這個key在失效的瞬間,持續的大並發就穿破緩存,直接請求數據庫,好像蠻力擊穿一樣。

面試官:講一下緩存穿透、緩存雪崩和緩存擊穿? 5

擊穿和穿透不同,穿透的意思是想法繞過redis去使得數據庫崩掉。而擊穿你可以理解為正面剛擊穿,這種通常為大量並發對一個key進行大規模的讀寫操作。這個key在緩存失效期間大量請求數據庫,對數據庫造成太大壓力使得數據庫崩掉。就比如在秒殺場景下10000塊錢的mac和100塊的mac這個100塊的那個訂單肯定會被搶到爆,不斷的請求(當然具體秒殺有自己處理方式這裡只是舉個例子)。所以緩存擊穿就是針對某個常用key大量請求導致數據庫崩潰。

解決方案

可以使用互斥鎖避免大量請求同時落到db。布隆過濾器,判斷某個容器是否在集合中可以將緩存設置永不過期(適合部分情況)做好熔斷、降級,防止系統崩潰。

下篇文章會講解redis緩存與關係數據庫數據一致性各種場景分析,敬請期待。

面試官:講一下緩存穿透、緩存雪崩和緩存擊穿? 6