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

前言

原創公衆號:bigsaimysql

對於緩存穿透、緩存雪崩和緩存擊穿經常出如今面試中,今天來看看它究竟是啥吧?面試

在這裏插入圖片描述
在這裏插入圖片描述

redis緩存穿透

在這裏插入圖片描述
理解redis

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

解決方案sql

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

redis緩存雪崩

理解數據庫

  • 雪崩,就是某東西蜂擁而至的意思,像雪崩同樣。在這裏,就是redis緩存集體大規模集體失效,在高併發狀況下忽然使得key大規模訪問mysql,使得數據庫崩掉。能夠想象下國家人口老年化。之後那天人集中在70-80歲,就沒人幹活了。國家勞動力就形成壓力。
    在這裏插入圖片描述

解決方案緩存

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

redis緩存擊穿

理解併發

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

在這裏插入圖片描述

  • 擊穿和穿透不一樣,穿透的意思是想法繞過redis去使得數據庫崩掉。而擊穿你能夠理解爲正面剛擊穿,這種一般爲大量併發對一個key進行大規模的讀寫操做。這個key在緩存失效期間大量請求數據庫,對數據庫形成太大壓力使得數據庫崩掉。就好比在秒殺場景下10000塊錢的mac和100塊的mac這個100塊的那個訂單確定會被搶到爆,不斷的請求(固然具體秒殺有本身處理方式這裏只是舉個例子)。因此緩存擊穿就是針對某個經常使用key大量請求致使數據庫崩潰。

解決方案code

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

原創公衆號:bigsai對象

相關文章
相關標籤/搜索