Redis雪崩如何處理以及與緩存穿透的區(qū)別?

1、Redis雪崩怎么處理?

案例場景:目前電商熱點數(shù)據(jù)都會去做緩存 ,一般緩存都是定時任務去刷新,或者是查不到之后去更新的,定時任務刷新就有一個問題。假設(shè)所有熱點數(shù)據(jù)的Key都是0點失效,0點刷新的,剛好我在零點有個秒殺活動有大量用戶涌入,假設(shè)當時每秒 10000 個請求,本來緩存在可以扛住每秒 5000 個請求,但是0點時所有的Key都失效了。此時 1 秒 10000?個請求全部到了數(shù)據(jù)庫,數(shù)據(jù)庫必然扛不住就直接掛了。這個時候重啟數(shù)據(jù)庫,又會新的流量給搞掛。這就是我理解的緩存雪崩。

處理方案:在批量往Redis存數(shù)據(jù)的時候,把每個Key的失效時間都加個隨機值,這樣可以保證數(shù)據(jù)不會在同一時間大面積失效。

如果Redis是集群部署,將熱點數(shù)據(jù)均勻分布在不同的Redis庫中也能避免全部失效的問題。或者設(shè)置熱點數(shù)據(jù)永遠不過期,有更新操作就更新緩存就好了

2、緩存穿透和擊穿與雪崩的區(qū)別?

緩存穿透是指緩存和數(shù)據(jù)庫中都沒有的數(shù)據(jù),而用戶不斷發(fā)起請求。例如我們數(shù)據(jù)庫的 id 都是1開始自增上去的,如發(fā)起id值為 -1 的數(shù)據(jù)請求。每次請求都能繞開Redis直接到數(shù)據(jù)庫,但是數(shù)據(jù)庫也查不到,如果同一時間大量這樣的請求會導致數(shù)據(jù)庫壓力過大,嚴重會擊垮數(shù)據(jù)庫。

緩存雪崩是因為緩存中的數(shù)據(jù)同一時間大面積失效造成大量請求直接到了數(shù)據(jù)庫造成數(shù)據(jù)庫崩潰,而緩存擊穿是指一個Key非常熱點,大量的請求對一個點進行訪問時造成數(shù)據(jù)庫崩潰。

處理方案:

方案一:可以把不存在的key也設(shè)置緩存,并設(shè)置過期時間;

解決思路,盡量的把請求攔截到,不讓它去訪問數(shù)據(jù)庫,那我們怎么去攔截呢,比如說,當拿一個不存在key訪問程序的時候,如果查詢數(shù)據(jù)庫,不存在對應的值,那我們也會給不存在的這個key 存入到緩存里面,并且可以設(shè)置緩存失效時間;比如說可以把對應的key設(shè)置為null值存入到緩存里面,如果下次有相同的key來訪問的時候,在緩存失效之前,都是直接從緩存里面??;這樣就會把不必要的請求攔截下來;

方案二:使用redis或者zookeep提供的互斥鎖也可以解決緩存擊穿

這種方案是通過異步方式 去獲取緩存過程中,其他key 處于等待現(xiàn)象,必須等待第一個構(gòu)建完緩存之后,釋放鎖,其他人才能通過該key才能訪問數(shù)據(jù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容