天天看點

面試官:什麼是緩存穿透、緩存雪崩和緩存擊穿?

原創公衆号:bigsai 轉載需聯系作者

什麼是緩存穿透、緩存雪崩和緩存擊穿?

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

面試官:什麼是緩存穿透、緩存雪崩和緩存擊穿?
面試官:什麼是緩存穿透、緩存雪崩和緩存擊穿?

redis緩存穿透

面試官:什麼是緩存穿透、緩存雪崩和緩存擊穿?

了解

  • 重在

    穿透

    吧,也就是通路透過redis直接經過mysql,通常是一個不存在的

    key

    ,在資料庫查詢為

    null

    。每次請求落在資料庫、并且高并發。資料庫扛不住會挂掉。

解決方案

  • 可以将查到的null設成該key的緩存對象。
  • 當然,也可以根據明顯錯誤的key在邏輯層就就行

    驗證

  • 同時,你也可以分析使用者行為,是否為故意請求或者爬蟲、攻擊者。針對使用者通路做限制。
  • 其他等等,比如用布隆過濾器(超大型hashmap)先過濾。

redis緩存雪崩

  • 雪崩,就是某

    東西蜂擁而至

    的意思,像雪崩一樣。在這裡,就是redis緩存集體

    大規模集體失效

    ,在高并發情況下突然使得key大規模通路mysql,使得資料庫崩掉。可以想象下國家

    人口老年化

    。以後那天人集中在70-80歲,就沒人幹活了。國家勞動力就造成壓力。
    面試官:什麼是緩存穿透、緩存雪崩和緩存擊穿?
  • 通常的解決方案是将key的過期時間後面加上一個

    随機數

    ,讓key均勻的失效。
  • 考慮用隊列或者鎖讓程式執行在壓力範圍之内,當然這種方案可能會影響并發量。
  • 熱點資料可以考慮不失效

redis緩存擊穿

了解

緩存擊穿,是指一個key非常熱點,在不停的扛着大并發,大并發集中對這一個點進行通路,當這個key在失效的瞬間,持續的大并發就穿破緩存,直接請求資料庫,好像蠻力擊穿一樣。

面試官:什麼是緩存穿透、緩存雪崩和緩存擊穿?
  • 擊穿和穿透不同,穿透的意思是想法

    繞過

    redis去使得資料庫崩掉。而擊穿你可以了解為

    正面剛

    擊穿,這種通常為大量并發對一個key進行大規模的讀寫操作。這個key在緩存失效期間大量請求資料庫,對資料庫造成太大壓力使得資料庫崩掉。就

    比如

    在秒殺場景下10000塊錢的mac和100塊的mac這個100塊的那個訂單肯定會被搶到爆,不斷的請求(當然具體秒殺有自己處理方式這裡隻是舉個例子)。是以緩存擊穿就是針對某個常用key大量請求導緻資料庫崩潰。
  • 可以使用互斥鎖避免大量請求同時落到db。
  • 布隆過濾器,判斷某個容器是否在集合中
  • 可以将緩存設定永不過期(适合部分情況)
  • 做好熔斷、降級,防止系統崩潰。

結語

本次講解就結束啦,最後想請51cto的朋友們幫忙兩連事:

  1. 微信搜尋「bigsai」,關注我的公衆号,不僅免費送你電子書,我還會第一時間在公衆号分享知識技術。加我還可拉你進力扣打卡群一起打卡LeetCode。

繼續閱讀