什么是緩存穿透枫匾、擊穿、雪崩

前言

緩存系統(tǒng)存在于持久層和應(yīng)用服務(wù)層之間腋逆,通過(guò)提前在內(nèi)存中加載熱點(diǎn)數(shù)據(jù)婿牍,減少服務(wù)器直接訪問(wèn)數(shù)據(jù)庫(kù)的次數(shù),從而提高性能和分擔(dān)數(shù)據(jù)庫(kù)壓力惩歉。

注意這里有兩個(gè)優(yōu)點(diǎn)

  • 提高性能等脂,響應(yīng)速度。由于緩存系統(tǒng)通常在內(nèi)存中加載數(shù)據(jù)撑蚌,減少了不必要的磁盤(pán)IO和數(shù)據(jù)傳輸及轉(zhuǎn)化上遥,極大幅度的提升了系統(tǒng)響應(yīng)速度。
  • 提高并發(fā)量≌浚現(xiàn)有計(jì)算機(jī)系統(tǒng)并發(fā)量非常龐大粉楚,但是傳統(tǒng)數(shù)據(jù)庫(kù)的連接數(shù)是有限的。通過(guò)分擔(dān)一部分JDBC亮垫,從而提高了并發(fā)量模软。

緩存系統(tǒng)提高性能的同時(shí)了帶來(lái)了其他風(fēng)險(xiǎn),他們分別是緩存穿透饮潦、緩存擊穿燃异、緩存雪崩。

緩存穿透

正常情況下继蜡,緩存系統(tǒng)存在數(shù)據(jù)就不會(huì)再訪問(wèn)數(shù)據(jù)庫(kù)回俐,數(shù)據(jù)庫(kù)有數(shù)據(jù)也會(huì)更新緩存系統(tǒng)逛腿。但是有一些KEY本身不存在于緩存系統(tǒng)和數(shù)據(jù)庫(kù)。那么就會(huì)出現(xiàn)如下場(chǎng)景仅颇,系統(tǒng)請(qǐng)求如同一把利刃穿透所有服務(wù)層单默,但最終什么也沒(méi)有返回跟束。

這個(gè)過(guò)程本身不會(huì)有什么問(wèn)題褂傀,但是假設(shè)有人發(fā)現(xiàn)我們的請(qǐng)求在某些場(chǎng)景下KEY會(huì)失效,那么就會(huì)不斷的發(fā)起這樣的請(qǐng)求诵冒,或者系統(tǒng)本身存在這樣的業(yè)務(wù)場(chǎng)景政冻。設(shè)想一下枚抵,系統(tǒng)的負(fù)載可能是K,但是這些無(wú)效請(qǐng)求只比K小了一部分明场,那么正常的請(qǐng)求將無(wú)法被系統(tǒng)處理,這是我們完全不想看到的李丰。

image.png

解決方案

針對(duì)這個(gè)問(wèn)題苦锨,目前有兩種普遍的解決方案:

  • 設(shè)置NULL值。當(dāng)我們無(wú)法查找道值的時(shí)候可以給緩存系統(tǒng)設(shè)置NULL值趴泌,假設(shè)不法分子試圖發(fā)起攻擊針對(duì)KEY=“key1”舟舒,那么我們就可以set key1=null,這樣系統(tǒng)就不會(huì)被占用嗜憔。
  • 利用布隆過(guò)濾器秃励。但是這樣的KEY值我們無(wú)法預(yù)測(cè)系統(tǒng)內(nèi)部或者外部有多少,我們就需要用到布隆過(guò)濾器吉捶,它的原理類似于對(duì)KEY進(jìn)行預(yù)先的判斷夺鲜,如果存在于系統(tǒng)我們才會(huì)放行。但是不攏過(guò)濾器可能存在一定誤判呐舔,這和它的實(shí)現(xiàn)原理相關(guān)币励。這里不贅述:https://blog.csdn.net/Zyw907155124/article/details/135556557

緩存擊穿

image.png

緩存擊穿需要以下條件同時(shí)存在:

  1. 某一KEY值不存在于系統(tǒng)和數(shù)據(jù)庫(kù)。
  2. 同一時(shí)刻珊拼,系統(tǒng)存在大量的并發(fā)請(qǐng)求通過(guò)了布隆過(guò)濾器等限制食呻,需要查詢數(shù)據(jù)庫(kù)。
  3. 并且這個(gè)事務(wù)非常復(fù)雜需要占據(jù)大量的系統(tǒng)資源去計(jì)算才能返回并設(shè)置新的緩存澎现。

這種情況下仅胞,高并發(fā)請(qǐng)求就好比無(wú)數(shù)個(gè)閃電,不停的電擊系統(tǒng)的同一部位剑辫,然后造成系統(tǒng)的癱瘓干旧。這一過(guò)程就像是擊穿了系統(tǒng)一樣。

解決方案

解決這個(gè)問(wèn)題的核心點(diǎn)就是某一時(shí)刻的大量緩存擊穿請(qǐng)求如何有序的進(jìn)行緩存重建揭斧,而不是無(wú)序的搶占系統(tǒng)資源莱革。所以常用的兩個(gè)方案是:

  1. 互斥鎖峻堰。鎖機(jī)制的本質(zhì)是強(qiáng)一致性,這可能會(huì)引起系統(tǒng)的可用性下降盅视,但是卻完全保持了請(qǐng)求的有序執(zhí)行捐名。
  2. 永不過(guò)期。正常的KEY都會(huì)有過(guò)期時(shí)間闹击,但是針對(duì)這種計(jì)算量龐大的KEY可以不設(shè)置他們的過(guò)期時(shí)間镶蹋,但是實(shí)際上查詢緩存是我們需要判斷邏輯上是否過(guò)期。如果數(shù)據(jù)過(guò)期赏半,則通過(guò)異步方式更新緩存贺归,避免在更新過(guò)程中返回臟數(shù)據(jù)。

緩存雪崩

緩存值集中在同一時(shí)刻大量失效断箫,系統(tǒng)又剛好需要請(qǐng)求這些失效的KEY拂酣,就有可能同時(shí)引發(fā)緩存擊穿和緩存穿透,并且對(duì)數(shù)據(jù)庫(kù)造成非常大的壓力仲义。

比如設(shè)計(jì)之初我們?cè)O(shè)想一百個(gè)請(qǐng)求只有十個(gè)在數(shù)據(jù)庫(kù)婶熬,但是緩存失效導(dǎo)致一百個(gè)全部落到數(shù)據(jù)庫(kù),從而引發(fā)整個(gè)系統(tǒng)的崩盤(pán)埃撵,這就好比一個(gè)細(xì)小的錯(cuò)誤卻導(dǎo)致大面積的服務(wù)癱瘓赵颅,雪崩就產(chǎn)生了。

解決方案

這個(gè)問(wèn)題其實(shí)很棘手暂刘,因?yàn)樗枰到y(tǒng)很多策略和方案同時(shí)起效才能一定程度上避免雪崩饺谬。

  1. 合理的設(shè)置失效時(shí)間,盡可能的讓系統(tǒng)的緩存均勻分布的去失效谣拣。
  2. 假設(shè)還是大面積失效募寨,那么引入二級(jí)緩存兜底。
  3. 假設(shè)二級(jí)緩存還是失效芝发,引入高可用系統(tǒng)绪商,提高緩存系統(tǒng)的并發(fā)量和可用性,準(zhǔn)備硬扛沖擊辅鲸。
  4. 針對(duì)并發(fā)量我們也可以入手格郁,設(shè)計(jì)排它鎖,讓請(qǐng)求有序執(zhí)行独悴。
  5. 建立高可用的系統(tǒng)做好最后都低兜底例书。
  6. 實(shí)在不行還可以緩存降級(jí),當(dāng)發(fā)現(xiàn)大量緩存失效時(shí)刻炒,緩存系統(tǒng)可以適當(dāng)?shù)慕档头?wù)級(jí)別决采。
    7.除此之外可以提前監(jiān)控緩存系統(tǒng),有效避免雪崩坟奥。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末树瞭,一起剝皮案震驚了整個(gè)濱河市拇厢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晒喷,老刑警劉巖孝偎,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異凉敲,居然都是意外死亡衣盾,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)爷抓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)势决,“玉大人,你說(shuō)我怎么就攤上這事蓝撇」矗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵渤昌,是天一觀的道長(zhǎng)据悔。 經(jīng)常有香客問(wèn)我,道長(zhǎng)耘沼,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任朱盐,我火速辦了婚禮群嗤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兵琳。我一直安慰自己狂秘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布躯肌。 她就那樣靜靜地躺著者春,像睡著了一般。 火紅的嫁衣襯著肌膚如雪清女。 梳的紋絲不亂的頭發(fā)上钱烟,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音嫡丙,去河邊找鬼拴袭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛曙博,可吹牛的內(nèi)容都是我干的拥刻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼父泳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼般哼!你這毒婦竟也來(lái)了吴汪?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蒸眠,失蹤者是張志新(化名)和其女友劉穎漾橙,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體黔宛,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡近刘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了臀晃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片觉渴。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖徽惋,靈堂內(nèi)的尸體忽然破棺而出案淋,到底是詐尸還是另有隱情,我是刑警寧澤险绘,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布踢京,位于F島的核電站,受9級(jí)特大地震影響宦棺,放射性物質(zhì)發(fā)生泄漏瓣距。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一代咸、第九天 我趴在偏房一處隱蔽的房頂上張望蹈丸。 院中可真熱鬧,春花似錦呐芥、人聲如沸逻杖。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)荸百。三九已至,卻和暖如春滨攻,著一層夾襖步出監(jiān)牢的瞬間够话,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工铡买, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留更鲁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓奇钞,卻偏偏與公主長(zhǎng)得像澡为,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子景埃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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