3.redis緩存雪崩梦染、穿透赡麦、擊穿概念及解決辦法

1.緩存雪崩

對于系統(tǒng) A,假設每天高峰期每秒 5000 個請求帕识,本來緩存在高峰期可以扛住每秒 4000 個請求泛粹,但是緩存機器意外發(fā)生了全盤宕機。緩存掛了肮疗,此時 1 秒 5000 個請求全部落數據庫晶姊,數據庫必然扛不住,它會報一下警伪货,然后就掛了们衙。此時,如果沒有采用什么特別的方案來處理這個故障碱呼,DBA 很著急蒙挑,重啟數據庫,但是數據庫立馬又被新的流量給打死了愚臀。
這就是緩存雪崩忆蚀。


image.png

解決方案如下:
事前:redis 高可用,主從+哨兵姑裂,redis cluster馋袜,避免全盤崩潰。
事中:本地 ehcache 緩存 + hystrix 限流&降級炭分,避免 MySQL 被打死桃焕。
事后:redis 持久化,一旦重啟捧毛,自動從磁盤上加載數據观堂,快速恢復緩存數據。

  • 處理緩存雪崩簡單呀忧,在批量往Redis存數據的時候师痕,把每個Key的失效時間都加個隨機值就好了,這樣可以保證數據不會再同一時間大面積失效而账。
setRedis(key, value, time+Math.random()*10000);
  • 如果Redis是集群部署胰坟,將熱點數據均勻分布在不同的Redis庫中也能避免全部失效。
  • 或者設置熱點數據永不過期泞辐,有更新操作就更新緩存就好了
image.png

用戶發(fā)送一個請求笔横,系統(tǒng) A 收到請求后竞滓,先查本地 ehcache 緩存,如果沒查到再查 redis吹缔。如果 ehcache 和 redis 都沒有商佑,再查數據庫,將數據庫中的結果厢塘,寫入 ehcache 和 redis 中茶没。

限流組件,可以設置每秒的請求晚碾,有多少能通過組件抓半,剩余的未通過的請求,怎么辦格嘁?走降級笛求!可以返回一些默認的值,或者友情提示讥蔽,或者空白的值涣易。

好處:

  • 數據庫絕對不會死,限流組件確保了每秒只有多少個請求能通過冶伞。
  • 只要數據庫不死新症,就是說,對用戶來說响禽,2/5 的請求都是可以被處理的徒爹。
  • 只要有 2/5 的請求可以被處理,就意味著你的系統(tǒng)沒死芋类,對用戶來說隆嗅,可能就是點擊幾次刷不出來頁面,但是多點幾次侯繁,就可以刷出來一次胖喳。

2.緩存穿透

對于系統(tǒng)A,假設一秒 5000 個請求贮竟,結果其中 4000 個請求是黑客發(fā)出的惡意攻擊丽焊。
黑客發(fā)出的那 4000 個攻擊,緩存中查不到咕别,每次你去數據庫里查技健,也查不到。
緩存穿透就是指緩存和數據庫中都沒有的數據

舉個栗子惰拱。數據庫 id 是從 1 開始的雌贱,結果黑客發(fā)過來的請求 id 全部都是負數。這樣的話,緩存中不會有欣孤,請求每次都“視緩存于無物”馋没,直接查詢數據庫。這種惡意攻擊場景的緩存穿透就會直接把數據庫給打死导街。


image.png

解決方式:

  • 每次系統(tǒng) A 從數據庫中只要沒查到披泪,就寫一個空值到緩存里去纤子,比如 set -999 UNKNOWN搬瑰。然后設置一個過期時間,這樣的話控硼,下次有相同的 key 來訪問的時候泽论,在緩存失效之前,都可以直接從緩存中取數據
  • 在接口層增加校驗卡乾,比如用戶鑒權翼悴,參數做校驗,不合法的校驗直接return幔妨,比如id做基礎校驗鹦赎,id<=0直接攔截。
  • 采用布隆過濾器(Bloom Filter) 這個也能很好的預防緩存穿透的發(fā)生误堡,他的原理就是利用高效的數據結構和算法快速判斷出你這個Key是否在數據庫中存在古话,不存在你return就好了,存在你就去查DB刷新KV再return锁施。

3.緩存擊穿

緩存擊穿:就是說某個 key 非常熱點陪踩,訪問非常頻繁,處于集中式高并發(fā)訪問的情況悉抵,當這個 key 在失效的瞬間肩狂,大量的請求就擊穿了緩存,直接請求數據庫姥饰,就像是在一道屏障上鑿開了一個洞傻谁。

解決方式:

  • 可以將熱點數據設置為永遠不過期;
  • 或者基于 redis or zookeeper 實現互斥鎖列粪,等待第一個請求構建完緩存之后审磁,再釋放鎖,進而其它請求才能通過該 key 訪問數據篱竭。
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末力图,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子掺逼,更是在濱河造成了極大的恐慌吃媒,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異赘那,居然都是意外死亡刑桑,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門募舟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祠斧,“玉大人,你說我怎么就攤上這事拱礁∽练妫” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵呢灶,是天一觀的道長吴超。 經常有香客問我,道長鸯乃,這世上最難降的妖魔是什么鲸阻? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮缨睡,結果婚禮上鸟悴,老公的妹妹穿的比我還像新娘。我一直安慰自己奖年,他們只是感情好细诸,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拾并,像睡著了一般揍堰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嗅义,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天屏歹,我揣著相機與錄音,去河邊找鬼之碗。 笑死蝙眶,一個胖子當著我的面吹牛,可吹牛的內容都是我干的褪那。 我是一名探鬼主播幽纷,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼博敬!你這毒婦竟也來了友浸?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤偏窝,失蹤者是張志新(化名)和其女友劉穎收恢,沒想到半個月后武学,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡伦意,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年火窒,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驮肉。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡熏矿,死狀恐怖,靈堂內的尸體忽然破棺而出离钝,到底是詐尸還是另有隱情票编,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布奈辰,位于F島的核電站栏妖,受9級特大地震影響,放射性物質發(fā)生泄漏奖恰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一宛裕、第九天 我趴在偏房一處隱蔽的房頂上張望瑟啃。 院中可真熱鬧,春花似錦揩尸、人聲如沸蛹屿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽错负。三九已至,卻和暖如春勇边,著一層夾襖步出監(jiān)牢的瞬間犹撒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工粒褒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留识颊,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓奕坟,卻偏偏與公主長得像祥款,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子月杉,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內容