redis產(chǎn)生雪崩怎么解決

redis產(chǎn)生雪崩怎么解決

產(chǎn)生雪崩的原因:

緩存雪崩通俗簡單的理解就是:由于原有緩存失效(或者數(shù)據(jù)未加載到緩存中),新緩存未到期間(緩存正常從Redis中獲取,如下圖)所有原本應(yīng)該訪問緩存的請求都去查詢數(shù)據(jù)庫了,而對數(shù)據(jù)庫CPU和內(nèi)存造成巨大壓力,嚴(yán)重的會造成數(shù)據(jù)庫宕機(jī),造成系統(tǒng)的崩潰。

基本解決思路如下:

? 第一,大多數(shù)系統(tǒng)設(shè)計者考慮用加鎖或者隊列的方式保證來保證不會有大量的線程對數(shù)據(jù)庫一次性進(jìn)行讀寫,避免緩存失效時對數(shù)據(jù)庫造成太大的壓力,雖然能夠在一定的程度上緩解了數(shù)據(jù)庫的壓力但是與此同時又降低了系統(tǒng)的吞吐量。

?第二,分析用戶的行為,盡量讓緩存失效的時間均勻分布。

?第三,如果是因為某臺緩存服務(wù)器宕機(jī),可以考慮做主備,比如:redis主備,但是雙緩存涉及到更新事務(wù)的問題,update可能讀到臟數(shù)據(jù),需要好好解決。

Redis雪崩效應(yīng)的解決方案:

1、可以使用分布式鎖,單機(jī)版的話本地鎖

2、消息中間件方式

3、一級和二級緩存Redis+Ehchache

4、均攤分配Redis的key的失效時間

解釋:

?1、? 當(dāng)突然有大量請求到數(shù)據(jù)庫服務(wù)器時候,進(jìn)行請求限制。使用所的機(jī)制,保證只有一個線程(請求)操作。否則進(jìn)行排隊等待(集群分布式鎖,單機(jī)本地鎖)。減少服務(wù)器吞吐量,效率低。

?加入鎖!

redis產(chǎn)生雪崩怎么解決

保證只能有一個線程進(jìn)入? 實際上只能有一個請求在執(zhí)行查詢操作

也可以在此處進(jìn)行使用限流的策略~

2、使用消息中間件解決

這種方案是最靠譜的方案!

消息中間件可以解決高并發(fā)!!!

如果大量的請求進(jìn)行訪問時候,Redis沒有值的情況,會將查詢的結(jié)果存放在消息中間件中(利用了MQ異步步特性)

redis產(chǎn)生雪崩怎么解決

3、做二級緩存,A1為原始緩存,A2為拷貝緩存,A1失效時,可以訪問A2,A1緩存失效時間設(shè)置為短期,A2設(shè)置為長期(此點(diǎn)為補(bǔ)充)

4、不同的key,設(shè)置不同的過期時間,讓緩存失效的時間點(diǎn)盡量均勻。

更多Redis相關(guān)知識,請訪問Redis使用教程欄目!

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊15 分享