【高并發(fā)】面試官:講講什么是緩存穿透兔魂?擊穿烤芦?雪崩?如何解決析校?

寫在前面

在前面的《【高并發(fā)】Redis如何助力高并發(fā)秒殺系統(tǒng)构罗?看完這篇我徹底懂了!智玻!》一文中遂唧,我們以高并發(fā)秒殺系統(tǒng)中扣減庫存的場景為例,說明了Redis是如何助力秒殺系統(tǒng)的吊奢。那么盖彭,說到Redis,往往更多的場景是被用作系統(tǒng)的緩存页滚,說到緩存召边,尤其是分布式緩存系統(tǒng),在實際高并發(fā)場景下裹驰,稍有不慎隧熙,就會造成緩存穿透、緩存擊穿和緩存雪崩的問題邦马。那什么是緩存穿透贱鼻?什么是緩存擊穿,又什么是緩存雪崩呢滋将?它們是如何造成的邻悬?又該如何解決呢?今天随闽,我們就一起來探討這些問題父丰。

緩存穿透

首先,我們來說說緩存穿透。什么是緩存穿透呢蛾扇?緩存穿透問題在一定程度上與緩存命中率有關攘烛。如果我們的緩存設計的不合理,緩存的命中率非常低镀首,那么坟漱,數(shù)據(jù)訪問的絕大部分壓力都會集中在后端數(shù)據(jù)庫層面。

什么是緩存穿透更哄?

如果在請求數(shù)據(jù)時芋齿,在緩存層和數(shù)據(jù)庫層都沒有找到符合條件的數(shù)據(jù),也就是說成翩,在緩存層和數(shù)據(jù)庫層都沒有命中數(shù)據(jù)觅捆,那么,這種情況就叫作緩存穿透麻敌。

我們可以使用下圖來表示緩存穿透的現(xiàn)象栅炒。


image

造成緩存穿透的主要原因就是:查詢某個Key對應的數(shù)據(jù),Redis緩存中沒有相應的數(shù)據(jù)术羔,則直接到數(shù)據(jù)庫中查詢赢赊。數(shù)據(jù)庫中也不存在要查詢的數(shù)據(jù),則數(shù)據(jù)庫會返回空聂示,而Redis也不會緩存這個空結果域携。這就造成每次通過這樣的Key去查詢數(shù)據(jù)都會直接到數(shù)據(jù)庫中查詢,Redis不會緩存空結果鱼喉。這就造成了緩存穿透的問題秀鞭。

如何解決緩存穿透問題?

既然我們知道了造成緩存穿透的主要原因就是緩存中不存在相應的數(shù)據(jù)扛禽,直接到數(shù)據(jù)庫查詢锋边,數(shù)據(jù)庫返回空結果,緩存中不存儲空結果编曼。

那我們就自然而然的想到了第一種解決方案:就是把空對象緩存起來豆巨。當?shù)谝淮螐臄?shù)據(jù)庫中查詢出來的結果為空時,我們就將這個空對象加載到緩存掐场,并設置合理的過期時間往扔,這樣,就能夠在一定程度上保障后端數(shù)據(jù)庫的安全熊户。

第二種解決緩存穿透問題的解決方案:就是使用布隆過濾器萍膛,布隆過濾器可以針對大數(shù)據(jù)量的、有規(guī)律的鍵值進行處理嚷堡。一條記錄是不是存在蝗罗,本質上是一個Bool值,只需要使用 1bit 就可以存儲。我們可以使用布隆過濾器將這種表示是串塑、否等操作沼琉,壓縮到一個數(shù)據(jù)結構中。比如桩匪,我們最熟悉的用戶性別這種數(shù)據(jù)打瘪,就非常適合使用布隆過濾器來處理。

緩存擊穿

如果我們?yōu)榫彺嬷械拇蟛糠謹?shù)據(jù)設置了相同的過期時間傻昙,則到了某一時刻瑟慈,緩存中的數(shù)據(jù)就會批量過期。

什么是緩存擊穿屋匕?

如果緩存中的數(shù)據(jù)在某個時刻批量過期,導致大部分用戶的請求都會直接落在數(shù)據(jù)庫上借杰,這種現(xiàn)象就叫作緩存擊穿过吻。

我么可以使用下圖來表示緩存擊穿的線程。


image

造成緩存擊穿的主要原因就是:我們?yōu)榫彺嬷械臄?shù)據(jù)設置了過期時間蔗衡。如果在某個時刻從數(shù)據(jù)庫獲取了大量的數(shù)據(jù)纤虽,并設置了相同的過期時間,這些緩存的數(shù)據(jù)就會在同一時刻失效绞惦,造成緩存擊穿問題逼纸。

如何解決緩存擊穿問題?

對于比較熱點的數(shù)據(jù)济蝉,我們可以在緩存中設置這些數(shù)據(jù)永不過期杰刽;也可以在訪問數(shù)據(jù)的時候,在緩存中更新這些數(shù)據(jù)的過期時間王滤;如果是批量入庫的緩存項贺嫂,我們可以為這些緩存項分配比較合理的過期時間,避免同一時刻失效雁乡。

還有一種解決方案就是:使用分布式鎖第喳,保證對于每個Key同時只有一個線程去查詢后端的服務,某個線程在查詢后端服務的同時踱稍,其他線程沒有獲得分布式鎖的權限曲饱,需要進行等待。不過在高并發(fā)場景下珠月,這種解決方案對于分布式鎖的訪問壓力比較大扩淀。

緩存雪崩

如果緩存系統(tǒng)出現(xiàn)故障,所有的并發(fā)流量就會直接到達數(shù)據(jù)庫桥温。

什么是緩存雪崩引矩?

如果在某一時刻緩存集中失效,或者緩存系統(tǒng)出現(xiàn)故障,所有的并發(fā)流量就會直接到達數(shù)據(jù)庫旺韭。數(shù)據(jù)存儲層的調用量就會暴增氛谜,用不了多長時間,數(shù)據(jù)庫就會被大流量壓垮区端,這種級聯(lián)式的服務故障值漫,就叫作緩存雪崩。

我們可以用下圖來表示緩存雪崩的現(xiàn)象织盼。


image

造成緩存雪崩的主要原因就是緩存集中失效杨何,或者緩存服務發(fā)生故障,瞬間的大并發(fā)流量壓垮了數(shù)據(jù)庫沥邻。

如何解決緩存雪崩問題危虱?

解決緩存雪崩問題最常用的一種方案就是保證Redis的高可用,將Redis緩存部署成高可用集群(必要時候做成異地多活)唐全,可以有效的防止緩存雪崩問題的發(fā)生埃跷。

為了緩解大并發(fā)流量,我們也可以使用限流降級的方式防止緩存雪崩邮利。例如弥雹,在緩存失效后,通過加鎖或者使用隊列來控制讀數(shù)據(jù)庫寫緩存的線程數(shù)量延届。具體點就是設置某些Key只允許一個線程查詢數(shù)據(jù)和寫緩存剪勿,其他線程等待。則能夠有效的緩解大并發(fā)流量對數(shù)據(jù)庫打來的巨大沖擊方庭。

另外厕吉,我們也可以通過數(shù)據(jù)預熱的方式將可能大量訪問的數(shù)據(jù)加載到緩存,在即將發(fā)生大并發(fā)訪問的時候械念,提前手動觸發(fā)加載不同的數(shù)據(jù)到緩存中赴涵,并為數(shù)據(jù)設置不同的過期時間,讓緩存失效的時間點盡量均勻订讼,不至于在同一時刻全部失效髓窜。

好了,今天就聊到這兒吧欺殿!別忘了點個贊寄纵,給個在看和轉發(fā),讓更多的人看到脖苏,一起學習程拭,一起進步!棍潘!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末恃鞋,一起剝皮案震驚了整個濱河市崖媚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恤浪,老刑警劉巖畅哑,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異水由,居然都是意外死亡荠呐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門砂客,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泥张,“玉大人,你說我怎么就攤上這事鞠值∶拇矗” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵彤恶,是天一觀的道長筝野。 經(jīng)常有香客問我,道長粤剧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任挥唠,我火速辦了婚禮抵恋,結果婚禮上,老公的妹妹穿的比我還像新娘宝磨。我一直安慰自己纹坐,他們只是感情好灭美,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般拙吉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顶燕,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天庇麦,我揣著相機與錄音,去河邊找鬼晒衩。 笑死嗤瞎,一個胖子當著我的面吹牛,可吹牛的內容都是我干的听系。 我是一名探鬼主播贝奇,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼靠胜!你這毒婦竟也來了掉瞳?” 一聲冷哼從身側響起毕源,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陕习,沒想到半個月后霎褐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡衡查,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年瘩欺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拌牲。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡俱饿,死狀恐怖,靈堂內的尸體忽然破棺而出塌忽,到底是詐尸還是另有隱情拍埠,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布土居,位于F島的核電站枣购,受9級特大地震影響,放射性物質發(fā)生泄漏擦耀。R本人自食惡果不足惜棉圈,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望眷蜓。 院中可真熱鬧分瘾,春花似錦、人聲如沸吁系。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汽纤。三九已至上岗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蕴坪,已是汗流浹背肴掷。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留背传,地道東北人捆等。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像续室,于是被迫代替她去往敵國和親栋烤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359