快取穿透、快取擊穿、快取雪崩
正常情況下,查詢的資料都存在,如果請求一個不存在的資料,也就是快取和資料庫都查不到這個資料,每次都會去資料庫查詢,這種查詢不存在資料的現象我們稱為快取穿透
穿透帶來的問題
如果每次都拿一個不存在的id去查詢資料庫,可能會導致你的資料庫壓力增大
解決辦法
-
快取空值
之所以發生穿透,是因為快取中沒有儲存這些資料的key,從而每次都查詢資料庫
我們可以為這些key在快取中設定對應的值為null,後面查詢這個key的時候就不用查詢資料庫了
當然為了健壯性,我們要對這些key設定過期時間,以防止真的有資料 -
BloomFilter
BloomFilter 類似於一個hbase set 用來判斷某個元素(key)是否存在於某個集合中
我們把有資料的key都放到BloomFilter中,每次查詢的時候都先去BloomFilter判斷,如果沒有就直接返回null
注意BloomFilter沒有刪除操作,對於刪除的key,查詢就會經過BloomFilter然後查詢快取再查詢資料庫,所以BloomFilter可以結合快取空值用,對於刪除的key,可以在快取中快取null
快取擊穿
什麼是快取擊穿
在高併發的情況下,大量的請求同時查詢同一個key時,此時這個key正好失效了,就會導致同一時間,這些請求都會去查詢資料庫,這樣的現象我們稱為快取擊穿
擊穿帶來的問題
會造成某一時刻資料庫請求量過大
解決辦法
採用分散式鎖,只有拿到鎖的第一個執行緒去請求資料庫,然後插入快取,當然每次拿到鎖的時候都要去查詢一下快取有沒有
快取雪崩
什麼是快取雪崩
當某一時刻發生大規模的快取失效的情況,比如你的快取服務宕機了