六脖捻、Redis 的緩存異常處理 —— 緩存雪崩弥搞、緩存擊穿甥捺、緩存穿透

在實(shí)際應(yīng)用 Redis 過(guò)程中抢蚀,如果將 Redis 作為數(shù)據(jù)庫(kù)的緩存,經(jīng)常會(huì)遇到這幾個(gè)問(wèn)題:緩存雪崩镰禾、緩存擊穿皿曲、緩存穿透等。

緩存雪崩

緩存雪崩指的是吴侦,大量的應(yīng)用無(wú)法在 Redis 緩存中處理屋休,然后大量請(qǐng)求發(fā)送到了數(shù)據(jù)庫(kù),導(dǎo)致數(shù)據(jù)庫(kù)的壓力激增备韧,甚至可能導(dǎo)致數(shù)據(jù)庫(kù)崩潰劫樟,從而導(dǎo)致整個(gè)系統(tǒng)崩潰,引發(fā)雪崩一樣的連鎖效應(yīng)织堂。

而引起緩存雪崩的原因叠艳,一般如下:
1、緩存中大量 key 同時(shí)過(guò)期
2易阳、Redis 實(shí)例掛掉了附较,無(wú)法處理請(qǐng)求

對(duì)于原因 1,在實(shí)際應(yīng)用中應(yīng)當(dāng)避免大量 key 同時(shí)過(guò)期的場(chǎng)景闽烙。如果確實(shí)有這種業(yè)務(wù)場(chǎng)景翅睛,可以微調(diào)這批 key 過(guò)期的時(shí)間,使其能有一定的相差間隔黑竞。

對(duì)于原因2,之前提到的Redis 主從集群其實(shí)可以比較好地實(shí)現(xiàn)主 Redis 實(shí)例掛掉后疏旨,能有其他從庫(kù)快速切換為主庫(kù)很魂,繼續(xù)提供服務(wù)。

當(dāng)然檐涝,以上都是預(yù)防的措施遏匆,如果已經(jīng)發(fā)生了 緩存雪崩,為了防止數(shù)據(jù)庫(kù)被大量的請(qǐng)求搞崩潰谁榜,可以采用 服務(wù)熔斷 或者 請(qǐng)求限流幅聘。

服務(wù)熔斷就是暫停對(duì)業(yè)務(wù)提供 Redis 服務(wù),直到 Redis 恢復(fù)正常窃植,再向外提供服務(wù)帝蒿。 當(dāng)然,這種情況下巷怜,業(yè)務(wù)也會(huì)整個(gè)停擺了葛超。 另外一種比較溫和的辦法就是請(qǐng)求限流暴氏。請(qǐng)求限流顧名思義,就是限制請(qǐng)求的流量绣张,隨機(jī)丟棄一部分的請(qǐng)求答渔,以保證不會(huì)同時(shí)有太多請(qǐng)求壓入數(shù)據(jù)庫(kù)。

緩存擊穿

緩存擊穿是指侥涵,針對(duì)某個(gè)熱點(diǎn)數(shù)據(jù)沼撕,突然在緩存中失效,然后這些請(qǐng)求到熱點(diǎn)數(shù)據(jù)的請(qǐng)求會(huì)都請(qǐng)求到數(shù)據(jù)庫(kù)芜飘。
緩存擊穿一般是熱點(diǎn) key 在 Redis 中過(guò)期了導(dǎo)致的端朵。 最直接的方法就是,對(duì)于熱點(diǎn) key 燃箭,就不設(shè)置過(guò)期時(shí)間冲呢。

緩存穿透

緩存穿透指的是,數(shù)據(jù)既不在 Redis 中招狸,也不在數(shù)據(jù)庫(kù)中敬拓。每次請(qǐng)求 Redis 發(fā)現(xiàn)沒(méi)有對(duì)應(yīng)的 key之后,再去請(qǐng)求數(shù)據(jù)庫(kù)裙戏,發(fā)現(xiàn)數(shù)據(jù)庫(kù)也沒(méi)有乘凸。 那么這時(shí), Redis 就相當(dāng)于一個(gè)擺設(shè)累榜,沒(méi)有具體的作用了营勤。如果有人惡意攻擊系統(tǒng),故意使用空值或者其他不存在的值進(jìn)行頻繁請(qǐng)求壹罚,那么也會(huì)對(duì)數(shù)據(jù)庫(kù)造成比較大的壓力葛作。

為了避免緩存穿透,我們可以:
1猖凛、緩存空值或缺省值

2赂蠢、采用布隆過(guò)濾器,提前判斷是否有此數(shù)據(jù)辨泳。
布隆過(guò)濾器實(shí)際上就是把 key 通過(guò)三次不同的哈希虱岂,計(jì)算出三個(gè)哈希值,然后在哈希表中把對(duì)應(yīng)哈希值位置置為1菠红。當(dāng)有新的請(qǐng)求過(guò)來(lái)時(shí)第岖,先判斷這個(gè) key 經(jīng)過(guò)N次哈希后,對(duì)應(yīng)的哈希值位置是否為1试溯,只要有一個(gè)不為1蔑滓,就說(shuō)明此 key 之前沒(méi)有緩存過(guò)。
實(shí)際上,布隆過(guò)濾器也是有缺陷的烫饼,它不能完全保證請(qǐng)求過(guò)來(lái)的 key 猎塞,通過(guò)布隆過(guò)濾器的校驗(yàn),就一定有這個(gè)數(shù)據(jù)杠纵。 但是荠耽,只要沒(méi)有通過(guò)布隆過(guò)濾器的校驗(yàn),那么這個(gè) key 就一定不存在比藻。 其實(shí)這樣就已經(jīng)可以過(guò)濾掉大部分不存在的 key 請(qǐng)求了铝量。
正如以上提到的布隆過(guò)濾器缺陷,如果布隆過(guò)濾器的哈希槽過(guò)短银亲,很有可能導(dǎo)致大部分的位置都為 1 慢叨,那么此時(shí),布隆過(guò)濾器就失去了它的意義务蝠。 所以拍谐,當(dāng)我們發(fā)現(xiàn)布隆過(guò)濾器大部分位置都為1了,應(yīng)該要擴(kuò)寬哈希槽馏段。

3轩拨、在實(shí)際業(yè)務(wù)中,我們對(duì)于請(qǐng)求的參數(shù)應(yīng)該要先進(jìn)行校驗(yàn)院喜,請(qǐng)求的參數(shù)應(yīng)該要在規(guī)定范圍內(nèi)亡蓉。實(shí)際上,在工程應(yīng)用中喷舀,主要也是依賴于參數(shù)的校驗(yàn)砍濒,過(guò)濾掉很多無(wú)效請(qǐng)求。

數(shù)據(jù)不一致性

當(dāng)使用 Redis 作為數(shù)據(jù)庫(kù)緩存時(shí)硫麻,可能會(huì)存在數(shù)據(jù)不一致的問(wèn)題爸邢。
當(dāng)需要修改一份數(shù)據(jù)時(shí),需要同時(shí)修改數(shù)據(jù)庫(kù)和緩存庶香,那么這里就要區(qū)分:先修改數(shù)據(jù)庫(kù)還是修改緩存甲棍;對(duì)于緩存,是直接修改數(shù)據(jù)還是刪除數(shù)據(jù)赶掖?


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市七扰,隨后出現(xiàn)的幾起案子奢赂,更是在濱河造成了極大的恐慌,老刑警劉巖颈走,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膳灶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)轧钓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)序厉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人毕箍,你說(shuō)我怎么就攤上這事弛房。” “怎么了而柑?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵文捶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我媒咳,道長(zhǎng)粹排,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任涩澡,我火速辦了婚禮顽耳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘妙同。我一直安慰自己射富,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布渐溶。 她就那樣靜靜地躺著辉浦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茎辐。 梳的紋絲不亂的頭發(fā)上宪郊,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音拖陆,去河邊找鬼弛槐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛依啰,可吹牛的內(nèi)容都是我干的乎串。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼速警,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼叹誉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起闷旧,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤长豁,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后忙灼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體匠襟,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钝侠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酸舍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帅韧。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖啃勉,靈堂內(nèi)的尸體忽然破棺而出忽舟,到底是詐尸還是另有隱情,我是刑警寧澤璧亮,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布萧诫,位于F島的核電站,受9級(jí)特大地震影響枝嘶,放射性物質(zhì)發(fā)生泄漏帘饶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一群扶、第九天 我趴在偏房一處隱蔽的房頂上張望及刻。 院中可真熱鬧,春花似錦竞阐、人聲如沸缴饭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)颗搂。三九已至,卻和暖如春幕垦,著一層夾襖步出監(jiān)牢的瞬間丢氢,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工先改, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疚察,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓仇奶,卻偏偏與公主長(zhǎng)得像貌嫡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子该溯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容