緩存穿透、緩存擊穿、緩存雪崩概念及解決方案

  • 一、緩存穿透(KEY不存在,能夠理解爲每次都穿透)
    • 訪問一個不存在的 key,緩存不起做用,請求會穿透到 DB,流量大時 DB 會掛掉。
    • 解決:
      • 一、採用布隆過濾器,使用一個足夠大的 bitmap,用於存儲可能訪問的 key,不存在的 key 直接被過濾;
      • 二、訪問 key 未在 DB 查詢到值,也將空值寫進緩存,但能夠設置較短過時時間。
  • 二、緩存雪崩(大量KEY同時過時)
    • 大量的 key 設置了相同的過時時間,致使在緩存在同一時刻所有失效,形成瞬時 DB 請求量大、壓力驟增,引發雪崩。
    • 解決方案
      • 能夠給緩存設置過時時間時加上一個隨機值時間,使得每一個 key 的過時時間分佈開來,不會集中在同一時刻失效。
  • 三、緩存擊穿(一個過時Key被併發訪問。能夠這麼理解:多個請求,因此是擊穿)
    • 一個存在的 key,在緩存過時的一刻,同時有大量的請求,這些請求都會擊穿到 DB,形成瞬時 DB 請求量大、壓力驟增。
    • 解決方案
      • 一、即便用分佈式鎖,解決多線程併發訪問問題。
        • 在訪問 key 以前,採用 SETNX(set if not exists)來設置另外一個短時間 key 來鎖住當前 key 的訪問,訪問結束再刪除該短時間 key。
      • 二、提早使用分佈式鎖:
        • 在 value 內部設置 1 個超時值 (timeout1), timeout1 比實際的 memcache timeout (timeout2) 小。當從 cache 讀取到 timeout1 發現它已通過期時候,立刻延長 timeout1 並從新設置到 cache。而後再從數據庫加載數據並設置到 cache 中。
      • 三、永不過時..
  • 四、參考:
相關文章
相關標籤/搜索