Redis緩存如何防止雪崩

https://segmentfault.com/a/1190000008931971

《Redis架構(gòu)之防雪崩設(shè)計(jì)》這篇文章(下文稱之為“原文”)寫得非常好严蓖,全面概括了大規(guī)模系統(tǒng)可能面對的緩存穿透和緩存雪崩等問題,可以看出是一線實(shí)戰(zhàn)經(jīng)驗(yàn)的精華總結(jié)烤黍,非常適合大家學(xué)習(xí)剃根。

而我想再補(bǔ)充一些信息览爵,使“原文”的版圖更加完整。

關(guān)于“緩存穿透”

“原文”給出了空對象和布隆過濾器兩種解決方案滓侍。

空對象是首選方案喝峦,簡單直接,碰到查詢結(jié)果為空的鍵剑梳,放一個空值在緩存中唆貌,下次再訪問就立刻知道這個鍵無效,不用發(fā)出SQL了垢乙。但“原文”也說了锨咙,存在如下問題:

第一,空值做了緩存追逮,意味著緩存層中存了更多的鍵蓖租,需要更多的內(nèi)存空間 ( 如果是攻擊,問題更嚴(yán)重 )羊壹,比較有效的方法是針對這類數(shù)據(jù)設(shè)置一個較短的過期時間蓖宦,讓其自動剔除。

第二油猫,緩存層和存儲層的數(shù)據(jù)會有一段時間窗口的不一致稠茂,可能會對業(yè)務(wù)有一定影響。例如過期時間設(shè)置為 5 分鐘情妖,如果此時存儲層添加了這個數(shù)據(jù)睬关,那此段時間就會出現(xiàn)緩存層和存儲層數(shù)據(jù)的不一致,此時可以利用消息系統(tǒng)或者其他方式清除掉緩存層中的空對象毡证。

對于第一點(diǎn)电爹,我還建議空值放在另外的緩存空間中,不宜與正常值共用空間料睛,否則當(dāng)空間不足時丐箩,緩存系統(tǒng)的LRU算法可能會先剔除正常值摇邦,再剔除空值——這個漏洞可能會受到攻擊。

對于第二點(diǎn)屎勘,如果是Redis緩存施籍,更新數(shù)據(jù)后直接在Redis中清除即可;如果是本地緩存概漱,就需要用消息來通知其他機(jī)器清除各自的本地緩存了丑慎。(業(yè)界終于接受了用消息來同步緩存的設(shè)計(jì)思想,cheers! )我有一個小項(xiàng)目joint-cache-redis來簡單地演示“用消息來同步多個機(jī)器的緩存”瓤摧,而且在實(shí)踐中發(fā)現(xiàn)Kafka可能比Redis MQ更適合于這個場景竿裂。

關(guān)于“緩存雪崩”

這句概括很傳神!緩存層宕掉后照弥,流量會像奔逃的野牛一樣铛绰,打向后端存儲

沒什么要補(bǔ)充的,就感謝一下Netflix開源的Hystrix吧产喉!雖然只是一個庫捂掰,但是要實(shí)現(xiàn)可靠的限流算法還是頗有門道的。

關(guān)于“緩存熱點(diǎn) key 重建”

“原文”說到在緩存失效的瞬間曾沈,有大量線程來重建緩存这嚣,造成后端負(fù)載加大,甚至可能會讓應(yīng)用崩潰塞俱,并給出“互斥鎖”和“永遠(yuǎn)不過期”兩種候選方案姐帚。

互斥鎖(Mutex):

“分布式緩存加鎖”通常是一個反模式(見我去年的文章大型服務(wù)端開發(fā)的反模式第7條),如果持有鎖的實(shí)例不穩(wěn)定導(dǎo)致沒及時釋放障涯,就會浪費(fèi)這個鎖罐旗,直到鎖過期∥ǖ“原文”的作者還指出有死鎖的風(fēng)險(xiǎn)九秀。

其實(shí)是可以優(yōu)化的:等待一兩次后,重試時可繞過互斥鎖粘我。即使繞過互斥鎖鼓蜒,也不會產(chǎn)生什么不好的后果,因?yàn)楦戮彺媸且粋€冪等操作征字。

也可以把鎖的過期時間設(shè)得更短都弹。

從這個例子我們能感覺到,冪等操作比非冪等操作更容易優(yōu)化匙姜。

永遠(yuǎn)不過期:

"原文"很好地介紹了在Redis中的做法畅厢。對于Guava本地緩存就簡單多了,使用refreshAfterWrite即可氮昧。

“原文”讀到最后框杜,才知道這是《Redis開發(fā)與運(yùn)維》一書的節(jié)選浦楣,相信這本書會是國產(chǎn)技術(shù)書籍的精品!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末霸琴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子昭伸,更是在濱河造成了極大的恐慌梧乘,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庐杨,死亡現(xiàn)場離奇詭異选调,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)灵份,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門仁堪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人填渠,你說我怎么就攤上這事弦聂。” “怎么了氛什?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵莺葫,是天一觀的道長。 經(jīng)常有香客問我枪眉,道長捺檬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任贸铜,我火速辦了婚禮堡纬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蒿秦。我一直安慰自己烤镐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布棍鳖。 她就那樣靜靜地躺著职车,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鹊杖。 梳的紋絲不亂的頭發(fā)上悴灵,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機(jī)與錄音骂蓖,去河邊找鬼积瞒。 笑死,一個胖子當(dāng)著我的面吹牛登下,可吹牛的內(nèi)容都是我干的茫孔。 我是一名探鬼主播叮喳,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缰贝!你這毒婦竟也來了馍悟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤剩晴,失蹤者是張志新(化名)和其女友劉穎锣咒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赞弥,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡毅整,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了绽左。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悼嫉。...
    茶點(diǎn)故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拼窥,靈堂內(nèi)的尸體忽然破棺而出戏蔑,到底是詐尸還是另有隱情,我是刑警寧澤鲁纠,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布辛臊,位于F島的核電站,受9級特大地震影響房交,放射性物質(zhì)發(fā)生泄漏彻舰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一候味、第九天 我趴在偏房一處隱蔽的房頂上張望刃唤。 院中可真熱鬧,春花似錦白群、人聲如沸尚胞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笼裳。三九已至,卻和暖如春粱玲,著一層夾襖步出監(jiān)牢的瞬間躬柬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工抽减, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留允青,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓卵沉,卻偏偏與公主長得像颠锉,于是被迫代替她去往敵國和親法牲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評論 2 359

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