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

緩存穿透

什麼是緩存穿透

正常狀況下,查詢的數據都存在,若是請求一個不存在的數據,也就是緩存和數據庫都查不到這個數據,每次都會去數據庫查詢,這種查詢不存在數據的現象咱們稱爲緩存穿透數據庫

穿透帶來的問題

若是每次都拿一個不存在的id去查詢數據庫,可能會致使你的數據庫壓力增大緩存

解決辦法

  1. 緩存空值
    之因此發生穿透,是由於緩存中沒有存儲這些數據的key,從而每次都查詢數據庫
    咱們能夠爲這些key在緩存中設置對應的值爲null,後面查詢這個key的時候就不用查詢數據庫了
    固然爲了健壯性,咱們要對這些key設置過時時間,以防止真的有數據
  2. BloomFilter
    BloomFilter 相似於一個hbase set 用來判斷某個元素(key)是否存在於某個集合中
    咱們把有數據的key都放到BloomFilter中,每次查詢的時候都先去BloomFilter判斷,若是沒有就直接返回null
    注意BloomFilter沒有刪除操做,對於刪除的key,查詢就會通過BloomFilter而後查詢緩存再查詢數據庫,因此BloomFilter能夠結合緩存空值用,對於刪除的key,能夠在緩存中緩存null

緩存擊穿

什麼是緩存擊穿

在高併發的狀況下,大量的請求同時查詢同一個key時,此時這個key正好失效了,就會致使同一時間,這些請求都會去查詢數據庫,這樣的現象咱們稱爲緩存擊穿併發

擊穿帶來的問題

會形成某一時刻數據庫請求量過大分佈式

解決辦法

採用分佈式鎖,只有拿到鎖的第一個線程去請求數據庫,而後插入緩存,固然每次拿到鎖的時候都要去查詢一下緩存有沒有高併發

緩存雪崩

什麼是緩存雪崩

當某一時刻發生大規模的緩存失效的狀況,好比你的緩存服務宕機了線程

解決辦法

  1. 採用集羣,下降服務宕機的機率
  2. ehcache本地緩存 + Hystrix限流&降級
    ehcache 本地緩存的目的也是考慮在 Redis Cluster 徹底不可用的時候,ehcache 本地緩存還可以支撐一陣
    使用 Hystrix進行限流 & 降級 ,好比一秒來了5000個請求,咱們能夠設置假設只能有一秒 2000個請求能經過這個組件,那麼其餘剩餘的 3000 請求就會走限流邏輯

解決熱點數據集中失效問題

咱們在設置緩存的時候,通常會給緩存設置一個失效時間,過了這個時間,緩存就失效了。
對於一些熱點的數據來講,當緩存失效之後會存在大量的請求過來,而後打到數據庫去,從而可能致使數據庫崩潰的狀況class

解決辦法

  1. 設置不一樣的失效時間
  2. 採用緩存擊穿的解決辦法,加鎖
  3. 永不失效,就是採用定時任務對快要失效的緩存進行更新緩存和失效時間
相關文章
相關標籤/搜索