緩存穿透
什麼是緩存穿透
正常狀況下,查詢的數據都存在,若是請求一個不存在的數據,也就是緩存和數據庫都查不到這個數據,每次都會去數據庫查詢,這種查詢不存在數據的現象咱們稱爲緩存穿透數據庫
穿透帶來的問題
若是每次都拿一個不存在的id去查詢數據庫,可能會致使你的數據庫壓力增大緩存
解決辦法
- 緩存空值
之因此發生穿透,是由於緩存中沒有存儲這些數據的key,從而每次都查詢數據庫
咱們能夠爲這些key在緩存中設置對應的值爲null,後面查詢這個key的時候就不用查詢數據庫了
固然爲了健壯性,咱們要對這些key設置過時時間,以防止真的有數據
- BloomFilter
BloomFilter 相似於一個hbase set 用來判斷某個元素(key)是否存在於某個集合中
咱們把有數據的key都放到BloomFilter中,每次查詢的時候都先去BloomFilter判斷,若是沒有就直接返回null
注意BloomFilter沒有刪除操做,對於刪除的key,查詢就會通過BloomFilter而後查詢緩存再查詢數據庫,因此BloomFilter能夠結合緩存空值用,對於刪除的key,能夠在緩存中緩存null
緩存擊穿
什麼是緩存擊穿
在高併發的狀況下,大量的請求同時查詢同一個key時,此時這個key正好失效了,就會致使同一時間,這些請求都會去查詢數據庫,這樣的現象咱們稱爲緩存擊穿併發
擊穿帶來的問題
會形成某一時刻數據庫請求量過大分佈式
解決辦法
採用分佈式鎖,只有拿到鎖的第一個線程去請求數據庫,而後插入緩存,固然每次拿到鎖的時候都要去查詢一下緩存有沒有高併發
緩存雪崩
什麼是緩存雪崩
當某一時刻發生大規模的緩存失效的狀況,好比你的緩存服務宕機了線程
解決辦法
- 採用集羣,下降服務宕機的機率
- ehcache本地緩存 + Hystrix限流&降級
ehcache 本地緩存的目的也是考慮在 Redis Cluster 徹底不可用的時候,ehcache 本地緩存還可以支撐一陣
使用 Hystrix進行限流 & 降級 ,好比一秒來了5000個請求,咱們能夠設置假設只能有一秒 2000個請求能經過這個組件,那麼其餘剩餘的 3000 請求就會走限流邏輯
解決熱點數據集中失效問題
咱們在設置緩存的時候,通常會給緩存設置一個失效時間,過了這個時間,緩存就失效了。
對於一些熱點的數據來講,當緩存失效之後會存在大量的請求過來,而後打到數據庫去,從而可能致使數據庫崩潰的狀況class
解決辦法
- 設置不一樣的失效時間
- 採用緩存擊穿的解決辦法,加鎖
- 永不失效,就是採用定時任務對快要失效的緩存進行更新緩存和失效時間