快取問題(一) 快取穿透、快取雪崩、快取併發 核心概念

Crzayliyang-架構Young發表於2020-11-10

程式碼地址: https://gitee.com/crazyliyang/video-teaching.git
視訊地址: https://www.bilibili.com/video/BV1Ha411c7hB

 

1. 快取穿透

 

快取穿透,是指查詢一個資料庫一定不存在的資料。

正常的使用快取流程大致是,資料查詢先進行快取查詢,如果key不存在或者key已經過期,再對資料庫進行查詢,並把查詢到的物件,放進快取。如果資料庫查詢物件為空,則不放進快取。

查詢一個根部不存在的Key, 必然就會每次都去查詢資料庫,而每次查詢都是空,每次又都不會進行快取。假如有惡意攻擊,就可以利用這個漏洞,對資料庫造成壓力,甚至壓垮資料庫.

程式碼流程如下:

 /**
    1.引數傳入物件主鍵ID
    2.根據redisKey從快取中獲取物件
    3.如果快取物件不為空,直接返回
    4.如果快取物件為空,進行資料庫查詢
    5.如果從資料庫查詢出的物件不為空,則放入快取
    */
    public ProductEntity getById(Serializable id) {

        String redisKey = buildKey(String.valueOf(id)); // 根據ID 構建rediskey

        String redisValue = redisOperations.get(redisKey);  // 2.根據redisKey從快取中獲取物件

        if (redisValue != null) {  // 3.如果快取物件不為空,直接返回
            return JSONUtil.parseObject(redisValue, ProductEntity.class); //直接返回;

        } else {  // 4.如果快取物件為空,進行資料庫查詢
            ProductEntity product = getBaseMapper().selectById(id);
            
            if(product !=null){// 5.如果從資料庫查詢出的物件不為空,則放入快取
                String jsonString = JSONUtil.toJSONString(product);
                redisOperations.set(redisKey, jsonString);  
                return product;
            }
            return null;
        }

    }

2. 快取雪崩 (快取失效)

 

快取雪崩,是指在某一個時間段,快取集中過期,  集中失效(可能是物理原因).

舉例:  

      2.1  馬上就要到雙十一零點( 00:00 ),很快就會迎來一波搶購,大量的併發訪問, 這波熱門商品時間比較集中的放入了快取(可以理解為統一時間併發的) ,  假設快取是一個小時。那麼到了凌晨一點鐘 ( 01:00 ) 的時候,這批商品的快取就都過期了。也就是快取集中過期, 集中失效.   而再對這批商品的訪問查詢,就都落到了資料庫上,對於資料庫而言,就會產生週期性的壓力波峰

    2.2 系統在某一個大量併發訪問的時候, 突然快取伺服器當機, 快取突然全部丟失, 全部失效 (物理原因)

此時大量的快取失效導致, 大量併發請求到達資料庫DB, 給資料庫造成壓力衝擊, 這就是快取雪崩.

 

3. 快取擊穿  (快取併發)

 

快取擊穿. 是指一個key非常熱點,在不停的扛著大併發,大併發集中對這一個key進行訪問,

當這個key在失效的瞬間,持續的大併發就擊穿快取大量的併發直接請求資料庫,  造成資料庫的壓力,

就像在一個屏障上鑿開了一個洞。

 

相關文章