用了強大的 Redis,咱們的項目是否是再也不害怕高併發查詢了?緩存穿透和緩存雪崩瞭解一下

關於 Redis 的使用,你們應該已經不陌生了,我也介紹過 Redis 的使用、數據結構、使用場景分析,既然 Redis 這個強大,那麼架構中引入了 Redis 以後,是否是就「無敵」了呢?數據庫

其實全部的架構、框架、組件,在解決一部分問題的同時,一樣也會帶來新的問題,讓咱們看看使用 Redis 可能會遇到什麼樣的問題。緩存

緩存穿透

Redis 大部分的使用場景,都是根據 key ,先在 Redis 中查詢,若是查詢不到的話,再查詢數據庫。數據結構

當有大量的請求,key 值根本不在 Redis 中,那麼查詢就會落到數據庫上,這些請求就彷彿「穿透」過了 Redis 落在了數據庫上,最後會致使數據庫不堪重負直至崩潰。架構

緩存穿透

讓咱們看看緩存穿透的應對策略:框架

1. 將無效 key 保存到 Redis 中

若是 Redis 中查詢不到,而且查詢數據庫也沒有結果,那麼就將這個 key 寫入到 Redis 中,設置 value = 空,這樣若是這個 key 值被重複訪問,也不會查詢數據庫。工具

將無效 key 保存到 Redis 中

可是若是數據庫幾分鐘後,存入了一條真實的數據,那麼就會發生數據庫和緩存數據不一致的狀況;spa

這種狀況,要麼主動更新 Redis 中這條 key-空 的數據,要麼在設置緩存的時候,同時設置緩存的額過時時間,這樣當時間一過,緩存數據就能夠刷入到 Redis 中了。插件

若是每次查詢的 key 值都不相同,好比收到惡意攻擊,每次訪問都是無效且不相同的 key 值,那麼這個辦法就會失效。線程

2. 布隆過濾器

布隆過濾器(Bloom Filter)的原理解釋起來很複雜,用白話歸納一下它的特色:它說某個 key 不存在,那麼就必定不存在,它說某個 key 存在,那麼很大多是存在(存在必定的誤判率)。code

使用布隆過濾器,擋回無效請求,流程大概是這樣的:

布隆過濾器

對布隆過濾器感興趣的同窗,能夠試一試 Google 出品的 Guava 工具庫,其中就有開箱即用的布隆過濾器:BloomFilter;

public class BloomFilterTest {
    public static void main(String[] args){
        int size = 1000000;
        //布隆過濾器
        BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size, 0.001);
        
        for (int i = 0; i < size; i++) {
            bloomFilter.put(i);
        }
        
    List<Integer> list = new ArrayList<Integer>(1000);
        for (int i = size + 1; i < size + 10000; i++) {
            if (bloomFilter.mightContain(i)) {
                list.add(i);
            }
        }
        System.out.println("誤判數量:" + list.size());
    }
}

另外,Redis 在 4.0 以後有了插件功能(Module),可使用外部的擴展功能,可使用 RedisBloom 做爲 Redis 布隆過濾器插件。

緩存雪崩

一般咱們在使用 Redis 的時候,都會爲緩存設置過時時間,可是若是在某個時間點,有大量緩存失效,那麼下一個時間點就會有大量請求訪問到數據庫,這種狀況下,數據庫可能由於訪問量多大致使「崩潰」,這就是緩存雪崩。

讓咱們看看緩存雪崩的解決方案:

1. 不設置緩存過時時間

最暴力的解決辦法,緩存不設置自動過時時間,只要緩存不崩,數據庫就不會崩。

2. 設置隨機過時時間

另一個辦法,就是讓緩存過時時間不那麼一致,好比一批緩存數據24小時後過時,那麼就在這個基礎上,讓每條緩存的過時時間先後隨機 1-6000 秒(1-10分鐘)。

3. 使用互斥鎖

在緩存失效後,經過互斥鎖或者隊列,控制讀數據庫和寫緩存的線程數量;不過這樣會致使系統的吞吐量降低。

4. 雙緩存

設置一級緩存和二級緩存,一級緩存過時時間短,二級緩存過時時間長或者不過時,一級緩存失效後訪問二級緩存,同時刷新一級緩存。

最後在強調一遍,任何架構、組件、框架的引入,都會帶來新的問題,咱們在使用的時候必定要有相應的評估和解決方案。

會點代碼的大叔 | 文【原創】

敬請關注會點代碼的大叔

相關文章
相關標籤/搜索