Redis緩存雪崩,穿透,擊穿

前言

????Redis的緩存雪崩,穿透,擊穿是在項(xiàng)目開發(fā)時(shí)應(yīng)該注意的問題,相信大部分人都經(jīng)??吹交蚵牭竭@幾個(gè)字眼,但是如果使用稍有不慎,可能會(huì)帶來嚴(yán)重的問題,不光會(huì)給公司帶來嚴(yán)重的經(jīng)濟(jì)利益問題,可能還會(huì)給自己的職業(yè)生涯帶來一定的影響,所以本篇文章旨在說清楚三者的問題并提供相應(yīng)的解決方案。

開始

? ??????一.緩存雪崩? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

????????雪崩的時(shí)候,沒有一片雪花是無辜的!同樣,緩存雪崩的時(shí)候,沒有一個(gè)請(qǐng)求是無辜的!

? ? ? ? 緩存雪崩是指緩存中數(shù)據(jù)大批量到過期時(shí)間或者緩存數(shù)據(jù)庫因?yàn)槟承┰虿荒苷9ぷ?,而大量的?qǐng)求全部落在數(shù)據(jù)庫上,引起數(shù)據(jù)庫壓力過大甚至宕機(jī),舉個(gè)例子,某電商網(wǎng)站有一個(gè)搶購活動(dòng),活動(dòng)時(shí)間為5個(gè)小時(shí),從下午3點(diǎn)活動(dòng)開始,7點(diǎn)活動(dòng)結(jié)束,剛好在7點(diǎn)整的時(shí)候有大量的用戶進(jìn)行搶購,然而這時(shí),Redis里面的緩存數(shù)據(jù)已經(jīng)過期了,用戶請(qǐng)求先到Redis里面請(qǐng)求數(shù)據(jù),里面沒有數(shù)據(jù),所有請(qǐng)求都落到了MySQL里面了,由于請(qǐng)求量過于大,所以此時(shí)MySQL承受不了如此大的壓力。

對(duì)比圖

  解決方案:

    1.配置Redis高可用,采用主從哨兵模式,當(dāng)redis因?yàn)槟承┰虿荒苷9ぷ鲿r(shí),切換到其他節(jié)點(diǎn),保證了系統(tǒng)能夠正常運(yùn)作。、

    2.讓過期時(shí)間不一致,如果讓緩存時(shí)間在同一時(shí)間內(nèi)全部失效,那么當(dāng)請(qǐng)求過多的時(shí)候就會(huì)全部落在數(shù)據(jù)庫里面,所以我們可以對(duì)數(shù)據(jù)設(shè)置不同的過期時(shí)間,這樣不會(huì)因?yàn)閿?shù)據(jù)大面積的過期。

    3.設(shè)置數(shù)據(jù)永不過期,為了降低風(fēng)險(xiǎn),可以將數(shù)據(jù)設(shè)置為永不過期,當(dāng)數(shù)據(jù)需要更新的時(shí)候相關(guān)人員可以直接在redis里修改,不過這樣做需要用更多的存儲(chǔ)空間。

    4.使用相應(yīng)的限流和降級(jí)組件,如Hystrix,Sentinel等,當(dāng)用戶量過大或者緩存層發(fā)生故障時(shí),這些組件將會(huì)很有用處。

二.緩存穿透? ? ? ? ? ? ?

 ? 緩存穿透是指緩存和數(shù)據(jù)庫中都沒有的數(shù)據(jù),而用戶不斷發(fā)起請(qǐng)求,最終導(dǎo)致數(shù)據(jù)庫宕機(jī),例如某個(gè)非法 分子或者競(jìng)爭(zhēng)對(duì)手發(fā)起一個(gè)查詢請(qǐng)求,查詢id為1或者id很大的商品,我們知道id一般設(shè)置為自增,所以不存在id為-1,所以不論在緩存層還是存儲(chǔ)層都無法查詢到,如果發(fā)起的請(qǐng)求太多太頻繁,結(jié)果可想而知。

 ? 解決方案:

    1.嚴(yán)謹(jǐn)?shù)男r?yàn)邏輯,在接口處對(duì)參數(shù)進(jìn)行嚴(yán)格的校驗(yàn),如果不滿足條件,直接返回。

if(id<=-1){? ?

????return"參數(shù)不合法";

}

    2.從緩存取不到的數(shù)據(jù),在數(shù)據(jù)庫中也沒有取到,這時(shí)可以將key-value對(duì)寫為key-null,緩存有效時(shí)間可以設(shè)置短點(diǎn),設(shè)置太長(zhǎng)會(huì)導(dǎo)致正常情況也沒法使用,這樣可以防止攻擊用戶反復(fù)用同一個(gè)id暴力攻擊

setExpired(key,null,time);

三.緩存擊穿? ??

????緩存擊穿指大量的請(qǐng)求一直訪問緩存中的一個(gè)熱點(diǎn)key,突然這個(gè)key過期了,大量的請(qǐng)求全部落到了數(shù)據(jù)上,和雪崩很類似,但是和雪崩的區(qū)別是雪崩情況是緩存中的key大量過期,所有請(qǐng)求落到了數(shù)據(jù)庫上,而擊穿是在某個(gè)時(shí)間點(diǎn)上某個(gè)key突然過期。

 解決方案:

   1.將熱點(diǎn)key設(shè)置永不過期,這樣就不用擔(dān)心因?yàn)閗ey過期而引起大量請(qǐng)求落到數(shù)據(jù)庫的情形,當(dāng)熱點(diǎn)key需要修改相關(guān)的數(shù)據(jù)時(shí)直接從緩存中修改。

   2.可以使用互斥鎖,當(dāng)緩存中的key過期時(shí),去數(shù)據(jù)庫中取出數(shù)據(jù)放到緩存中,使用了互斥鎖,就避免所有請(qǐng)求一下全部落到了數(shù)據(jù)庫中。

今天的文章就分享到這里,喜歡可以關(guān)注,我是小四,一個(gè)喜歡文學(xué)也喜歡技術(shù)的渣男

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

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