天天看點

redis的緩存穿透、擊穿和雪崩背景:緩存雪崩:緩存擊穿:緩存穿透:總結: 

背景:

       随着使用者的增長,使用者的請求也越來越頻繁,為了保證伺服器在高并發的情況能正常提供服務,我們首先引入了緩存Redis,減少資料庫的壓力和資料的安全性同時提高了接口反應速度,解決了使用者的請求直接與資料庫建立連接配接。 

       但是在使用Redis的時候,随之而來的問題也會越來越多,有些請求甚至會直接越過Redis直接請求資料庫,今天我們來了解Redis資料庫經常會談及的問題緩存雪崩、緩存擊穿、緩存穿透。

緩存雪崩:

概念:

       在某一時刻,大量的key失效,使用者大量請求直接請求資料庫,導緻資料庫當機。此時的Redis形同虛設,使用者大量請求都命中不了,導緻資料庫伺服器壓力過大,Redis本身是用來減少資料庫的壓力,那麼此時如何解決呢?

解決方案:

       1、随機設定緩存的過期時間,以防同時過期大量緩存資料。

       2、如果是在叢集環境中,将熱點資料均勻分布在不同的緩存資料庫中。

       3、可以設定熱點資料永不過期,如果有資料更新就直接更新redis即可。

緩存擊穿:

概念:

       緩存裡面的一個key非常的火爆,在某一時間這個key剛好過期,大并發資料量擊穿了緩存直接請求資料庫,導緻資料庫壓力過大,嚴重情況會導緻資料庫崩潰,這就是緩存擊穿。

       例如:微網誌熱點新聞,某個明星又出绯聞了,然後大量的粉絲刷文章刷評論,一時間熱火朝天,突然請求這條微網誌的緩存過期,那麼大量的請求直接湧向資料庫,建立大量連接配接,資料庫還沒反應過來就崩了。

解決方案:

       1、設定這個key永遠不會過。

       2、程式控制請求資料庫的次數,比如添加互斥鎖、延時請求(1s後請求)。

       3、伺服器熔斷、降級,限制每個使用者的通路次數,并且如果擷取不到資料即傳回一個固定的推薦頁面。

緩存穿透:

概念:

       使用者不斷地請求一個緩存沒有,并且資料庫也沒有的資料,伺服器瘋狂的跟資料庫建立連接配接進而壓倒資料庫。比如說:根據産品id擷取産品詳情的接口,那麼我用一個id=-1去請求,那肯定是擷取不到任何資料的。一般這樣的情況有可能伺服器遭到了惡意攻擊。

解決方案:

       1、在使用者請求的接口層增加一些校驗,例如:使用者鑒權校驗、參數傳值校驗等不合法的參數請求即直接傳回。開發者應該保持一個悲觀的态度,不要相信任何用戶端因為計算機本身不知道操作者是誰,任何參數都應該考慮到。

       2、使用Redis進階資料結構布隆過濾器,他就是檢測資料庫中是否存在該key,不存在就直接傳回即可。

總結:

       緩存的雪崩、擊穿、穿透其實都是用戶端請求直接越過緩存直接請求資料庫,但是他們從意義上來講又有微妙的不同。大家一定要了解這三者是如何産生的,才能對症下藥。在使用者請求的時候我們可以配置伺服器的熔斷+降級,保證伺服器不會崩潰,使用者請求頻繁可以限制它的請求次數,或者可以犧牲部分使用者的性能。

       一般來講資料到達一定量後,為了保證伺服器的高可用,我們會對redis建立叢集或者是主從+哨兵模式,避免redis直接挂掉沒有任何的機器代替。也可以使用redis持久化,如果redis崩潰,重新開機後且恢複資料。當然,我們也要保證資料庫本身具有一定的抗壓性,比如我們添加一主多從的資料庫,保證資料庫不會那麼容易崩潰。

繼續閱讀