常常被提到的緩存穿透、雪崩和擊穿究竟是什麼?

對於緩存穿透、緩存雪崩和緩存擊穿經常出如今面試中,今天來看看它究竟是何方神聖mysql

在這裏插入圖片描述​ !

在這裏插入圖片描述理解面試

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

解決方案redis

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

redis緩存雪崩

理解sql

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

解決方案數據庫

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

redis緩存擊穿

理解緩存

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

在這裏插入圖片描述

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

解決方案高併發

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

本文就到這裏了,以爲不錯的話不妨點個贊加個關注,省得下次找不到了哦。spa

相關文章
相關標籤/搜索