了解什么是 redis 的雪崩瓷式、穿透和擊穿?redis 崩潰之后會(huì)怎么樣语泽?系統(tǒng)該如何應(yīng)對(duì)這種情況贸典?如何處理 redis 的穿透?

原文出處:https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/redis-caching-avalanche-and-caching-penetration.md
歡迎 star 關(guān)注 GitHub 項(xiàng)目最新動(dòng)態(tài)踱卵!

面試題

了解什么是 redis 的雪崩瓤漏、穿透和擊穿?redis 崩潰之后會(huì)怎么樣?系統(tǒng)該如何應(yīng)對(duì)這種情況蔬充?如何處理 redis 的穿透?

面試官心理分析

其實(shí)這是問(wèn)到緩存必問(wèn)的班利,因?yàn)榫彺嫜┍篮痛┩讣⒙蔷彺孀畲蟮膬蓚€(gè)問(wèn)題,要么不出現(xiàn)罗标,一旦出現(xiàn)就是致命性的問(wèn)題庸队,所以面試官一定會(huì)問(wèn)你。

面試題剖析

緩存雪崩

對(duì)于系統(tǒng) A闯割,假設(shè)每天高峰期每秒 5000 個(gè)請(qǐng)求彻消,本來(lái)緩存在高峰期可以扛住每秒 4000 個(gè)請(qǐng)求,但是緩存機(jī)器意外發(fā)生了全盤(pán)宕機(jī)宙拉。緩存掛了宾尚,此時(shí) 1 秒 5000 個(gè)請(qǐng)求全部落數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)必然扛不住谢澈,它會(huì)報(bào)一下警煌贴,然后就掛了。此時(shí)锥忿,如果沒(méi)有采用什么特別的方案來(lái)處理這個(gè)故障牛郑,DBA 很著急,重啟數(shù)據(jù)庫(kù)敬鬓,但是數(shù)據(jù)庫(kù)立馬又被新的流量給打死了淹朋。

這就是緩存雪崩。

redis-caching-avalanche.png

大約在 3 年前钉答,國(guó)內(nèi)比較知名的一個(gè)互聯(lián)網(wǎng)公司础芍,曾因?yàn)榫彺媸鹿剩瑢?dǎo)致雪崩希痴,后臺(tái)系統(tǒng)全部崩潰者甲,事故從當(dāng)天下午持續(xù)到晚上凌晨 3~4 點(diǎn),公司損失了幾千萬(wàn)砌创。

緩存雪崩的事前事中事后的解決方案如下虏缸。

  • 事前:redis 高可用,主從+哨兵嫩实,redis cluster刽辙,避免全盤(pán)崩潰。
  • 事中:本地 ehcache 緩存 + hystrix 限流&降級(jí)甲献,避免 MySQL 被打死宰缤。
  • 事后:redis 持久化,一旦重啟,自動(dòng)從磁盤(pán)上加載數(shù)據(jù)慨灭,快速恢復(fù)緩存數(shù)據(jù)朦乏。
redis-caching-avalanche-solution.png

用戶(hù)發(fā)送一個(gè)請(qǐng)求,系統(tǒng) A 收到請(qǐng)求后氧骤,先查本地 ehcache 緩存呻疹,如果沒(méi)查到再查 redis。如果 ehcache 和 redis 都沒(méi)有筹陵,再查數(shù)據(jù)庫(kù)刽锤,將數(shù)據(jù)庫(kù)中的結(jié)果,寫(xiě)入 ehcache 和 redis 中朦佩。

限流組件并思,可以設(shè)置每秒的請(qǐng)求,有多少能通過(guò)組件语稠,剩余的未通過(guò)的請(qǐng)求宋彼,怎么辦?走降級(jí)颅筋!可以返回一些默認(rèn)的值宙暇,或者友情提示,或者空白的值议泵。

好處:

  • 數(shù)據(jù)庫(kù)絕對(duì)不會(huì)死占贫,限流組件確保了每秒只有多少個(gè)請(qǐng)求能通過(guò)。
  • 只要數(shù)據(jù)庫(kù)不死先口,就是說(shuō)型奥,對(duì)用戶(hù)來(lái)說(shuō),2/5 的請(qǐng)求都是可以被處理的碉京。
  • 只要有 2/5 的請(qǐng)求可以被處理厢汹,就意味著你的系統(tǒng)沒(méi)死,對(duì)用戶(hù)來(lái)說(shuō)谐宙,可能就是點(diǎn)擊幾次刷不出來(lái)頁(yè)面烫葬,但是多點(diǎn)幾次,就可以刷出來(lái)一次凡蜻。

緩存穿透

對(duì)于系統(tǒng)A搭综,假設(shè)一秒 5000 個(gè)請(qǐng)求,結(jié)果其中 4000 個(gè)請(qǐng)求是黑客發(fā)出的惡意攻擊划栓。

黑客發(fā)出的那 4000 個(gè)攻擊兑巾,緩存中查不到,每次你去數(shù)據(jù)庫(kù)里查忠荞,也查不到蒋歌。

舉個(gè)栗子帅掘。數(shù)據(jù)庫(kù) id 是從 1 開(kāi)始的,結(jié)果黑客發(fā)過(guò)來(lái)的請(qǐng)求 id 全部都是負(fù)數(shù)堂油。這樣的話(huà)修档,緩存中不會(huì)有,請(qǐng)求每次都“視緩存于無(wú)物”称诗,直接查詢(xún)數(shù)據(jù)庫(kù)萍悴。這種惡意攻擊場(chǎng)景的緩存穿透就會(huì)直接把數(shù)據(jù)庫(kù)給打死。

redis-caching-penetration.png

解決方式很簡(jiǎn)單寓免,每次系統(tǒng) A 從數(shù)據(jù)庫(kù)中只要沒(méi)查到,就寫(xiě)一個(gè)空值到緩存里去计维,比如 set -999 UNKNOWN袜香。然后設(shè)置一個(gè)過(guò)期時(shí)間,這樣的話(huà)鲫惶,下次有相同的 key 來(lái)訪(fǎng)問(wèn)的時(shí)候蜈首,在緩存失效之前,都可以直接從緩存中取數(shù)據(jù)欠母。

緩存擊穿

緩存擊穿欢策,就是說(shuō)某個(gè) key 非常熱點(diǎn),訪(fǎng)問(wèn)非常頻繁赏淌,處于集中式高并發(fā)訪(fǎng)問(wèn)的情況踩寇,當(dāng)這個(gè) key 在失效的瞬間,大量的請(qǐng)求就擊穿了緩存六水,直接請(qǐng)求數(shù)據(jù)庫(kù)俺孙,就像是在一道屏障上鑿開(kāi)了一個(gè)洞。

解決方式也很簡(jiǎn)單掷贾,可以將熱點(diǎn)數(shù)據(jù)設(shè)置為永遠(yuǎn)不過(guò)期睛榄;或者基于 redis or zookeeper 實(shí)現(xiàn)互斥鎖,等待第一個(gè)請(qǐng)求構(gòu)建完緩存之后想帅,再釋放鎖场靴,進(jìn)而其它請(qǐng)求才能通過(guò)該 key 訪(fǎng)問(wèn)數(shù)據(jù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末港准,一起剝皮案震驚了整個(gè)濱河市旨剥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叉趣,老刑警劉巖泞边,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異疗杉,居然都是意外死亡阵谚,警方通過(guò)查閱死者的電腦和手機(jī)蚕礼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)梢什,“玉大人奠蹬,你說(shuō)我怎么就攤上這事∥宋纾” “怎么了囤躁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)荔睹。 經(jīng)常有香客問(wèn)我狸演,道長(zhǎng),這世上最難降的妖魔是什么僻他? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任宵距,我火速辦了婚禮,結(jié)果婚禮上吨拗,老公的妹妹穿的比我還像新娘满哪。我一直安慰自己,他們只是感情好劝篷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布哨鸭。 她就那樣靜靜地躺著,像睡著了一般娇妓。 火紅的嫁衣襯著肌膚如雪像鸡。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天峡蟋,我揣著相機(jī)與錄音坟桅,去河邊找鬼。 笑死蕊蝗,一個(gè)胖子當(dāng)著我的面吹牛仅乓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蓬戚,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼夸楣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了子漩?” 一聲冷哼從身側(cè)響起豫喧,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎幢泼,沒(méi)想到半個(gè)月后紧显,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缕棵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年孵班,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涉兽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡篙程,死狀恐怖枷畏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情虱饿,我是刑警寧澤拥诡,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站氮发,受9級(jí)特大地震影響渴肉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜爽冕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一宾娜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扇售,春花似錦、人聲如沸嚣艇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)食零。三九已至困乒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贰谣,已是汗流浹背娜搂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吱抚,地道東北人百宇。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像秘豹,于是被迫代替她去往敵國(guó)和親携御。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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