1. 程式人生 > >Redis快取設計之快取穿透、快取雪崩

Redis快取設計之快取穿透、快取雪崩

使用快取的優缺點:

優點:

  1. 提高系統響應速度,加速讀寫,Redis將數全都存放在記憶體中,響應速度更快。
  2. 降低了後臺的負載,減少了對後端的直接訪問

缺點:

  1. 資料一致性問題,快取層的資料與儲存層的資料可能存在不一致的問題
  2. 維護複雜度高了,加入快取後要同時處理快取曾和持久層的程式碼邏輯

快取穿透問題

快取穿透就是指查詢一個根本不存在的資料,導致很多請求直接穿過了快取層直接到了持久層,,導致後端的負載加大。

導致快取穿透的原因有以下幾個:

  1. 業務邏輯程式碼本身就存在問題導致快取穿透
  2. 受到了惡意的攻擊以及網路爬蟲等,導致大量請求快取空命中

解決快取穿透的方案:

1、快取空資料

也就是說如果快取層沒有命中這個資料,查詢持久層返回資料的同時也將空物件也快取到快取層,那麼下一次請求就命中了。

public void getResult(String key)
{
    String result = redisCache.get(key);
        if(ValidationUtils.isEmpty(result))
        {
            result = DB.get(key);
            redisCache.set(key,result);
            if(ValidationUtils.isEmpty(result))
                {
                    //設定失效時間
                    redisCache.expire(key,60*10);    
                }
                returult;
        }
        else
        {
            //快取命中
            return result;
        }
}

快取空資料缺點:

  1. 快取了空資料,也就說明有更多的key湧入了快取層,也就需要消耗更多的記憶體,如果是惡意攻擊那簡直就是噩夢
  2. 快取層與持久層的資料不一致問題,如果我快取一個空物件並設定了失效時間為10分鐘,那如果持久層真的持久化了這一資料,這5分鐘內我快取層和持久層的資料是不一致的。

2.布隆過濾器

基本思想就是在快取層和持久層之前將存在的key用布隆攔截器儲存起來做第一層攔截。如果布隆攔截器認為資料不存在就不訪問持久層了,這樣也解決了快取擊穿的問題。

快取雪崩問題

在高併發的系統中快取層負載了很大一部分的請求,降低的持久層的壓力,如果快取層由於某些原因停止服務了,那麼所有的請求都將直接訪問到持久層,由於持久層的處理速度效能遠遠不及快取層,就可能導致持久層也會服務不可用,還有一種情況是大量的快取資料在同一時刻失效了,也可能導致快取雪崩。

解決快取雪崩方案

  1. 1.保證快取服務的高可用性,比如使用Redis哨兵監控Redis叢集以及使用Redis Cluster等。即使單個節點宕機了,備用節點還能頂上去保證服務可用。
  2. 做二級快取,當一級快取停止服務,或大量失效時,由二級快取頂住訪問壓力。
  3. 不同的key之間的失效時間設定不同保證資料失效均衡。