緩存穿透瑟押、緩存擊穿、緩存雪崩區(qū)別和解決方案

緩存穿透星掰、緩存擊穿多望、緩存雪崩區(qū)別和解決方案

有很多解決高并發(fā)的應(yīng)用場景中都會使用memcache\redis緩存來解決響應(yīng)慢的問題,但是緩存也不是萬能的氢烘,在使用方面有很多的考慮的問題怀偷,把緩存比喻成防彈衣,但是如果你沒有穿好這件防彈衣會適得其反播玖,下面我根據(jù)自己的理解就展開來談?wù)劇?/p>

在高并發(fā)場景下有一個常常被忽略的一個地方椎工,讀多還是寫多,讀多寫少用緩存蜀踏,寫多讀少用隊列维蒙。

為什么要用緩存?為了系統(tǒng)的高性能,在每個系統(tǒng)的性能指標(biāo)中有兩個重要的點果覆,一個是性能最佳點和性能最大值颅痊,超過最大融載值就走向系統(tǒng)崩潰的邊緣了。

緩存穿透

緩存穿透是指緩存和數(shù)據(jù)庫中都沒有的數(shù)據(jù)局待,而用戶不斷發(fā)起請求斑响,特別大不存在的數(shù)據(jù)菱属。這時的用戶很可能是攻擊者,攻擊會導(dǎo)致數(shù)據(jù)庫壓力過大舰罚。

解決方案:

1.在服務(wù)器端纽门,接收參數(shù)時業(yè)務(wù)接口中過濾不合法的值,null沸停,負(fù)值膜毁,和空值進行檢測和空值昭卓。

2.bloom filter:類似于哈希表的一種算法愤钾,用所有可能的查詢條件生成一個bitmap,在進行數(shù)據(jù)庫查詢之前會使用這個bitmap進行過濾候醒,如果不在其中則直接過濾能颁,從而減輕數(shù)據(jù)庫層面的壓力。

3.空值緩存:一種比較簡單的解決辦法倒淫,在第一次查詢完不存在的數(shù)據(jù)后伙菊,將該key與對應(yīng)的空值也放入緩存中,只不過設(shè)定為較短的失效時間敌土,例如幾分鐘镜硕,這樣則可以應(yīng)對短時間的大量的該key攻擊,設(shè)置為較短的失效時間是因為該值可能業(yè)務(wù)無關(guān)返干,存在意義不大兴枯,且該次的查詢也未必是攻擊者發(fā)起,無過久存儲的必要矩欠,故可以早點失效财剖。

緩存雪崩

因為緩存服務(wù)掛掉或者熱點緩存失效,所有請求都去查數(shù)據(jù)庫癌淮,導(dǎo)致數(shù)據(jù)庫連接不夠或者數(shù)據(jù)庫處理不過來躺坟,從而導(dǎo)致整個系統(tǒng)不可用。

解決方案:

加鎖排隊乳蓄、 設(shè)置過期標(biāo)志更新緩存 咪橙、 設(shè)置過期標(biāo)志更新緩存 、二級緩存(引入一致性問題)虚倒、 預(yù)熱美侦、 緩存與服務(wù)降級。

1.線程互斥:只讓一個線程構(gòu)建緩存裹刮,其他線程等待構(gòu)建緩存的線程執(zhí)行完音榜,重新從緩存獲取數(shù)據(jù)才可以,每個時刻只有一個線程在執(zhí)行請求捧弃,減輕了db的壓力赠叼,但缺點也很明顯擦囊,降低了系統(tǒng)的qps。

2.交錯失效時間:這種方法時間比較簡單粗暴嘴办,既然在同一時間失效會造成請求過多雪崩瞬场,那我們錯開不同的失效時間即可從一定長度上避免這種問題,在緩存進行失效時間設(shè)置的時候涧郊,從某個適當(dāng)?shù)闹涤蛑须S機一個時間作為失效時間即可贯被。

緩存擊穿

緩存擊穿實際上是緩存雪崩的一個特例,緩存擊穿是指緩存中沒有但數(shù)據(jù)庫中有的數(shù)據(jù)(一般是緩存時間到期)妆艘,這時由于并發(fā)用戶特別多彤灶,同時讀緩存沒讀到數(shù)據(jù),又同時去數(shù)據(jù)庫去取數(shù)據(jù)批旺,引起數(shù)據(jù)庫壓力瞬間增大幌陕,造成過大壓力。擊穿與雪崩的區(qū)別即在于擊穿是對于某一特定的熱點數(shù)據(jù)來說汽煮,而雪崩是全部數(shù)據(jù)搏熄。

解決方案:

1.緩存設(shè)置不過期。

從redis上看暇赤,確實沒有設(shè)置過期時間心例,這就保證了,不會出現(xiàn)熱點key過期問題鞋囊,也就是物理不過期止后。但是它會遇到一個數(shù)據(jù)更新的問題,或者說數(shù)據(jù)不一致的問題失暴。

在value中存儲過期時間坯门,在編碼處理的時候,有條件(過期時間小于一分鐘)對緩存數(shù)據(jù)進行更新逗扒,這個方案對性能最佳古戴。

2.使用鎖工具(分布式鎖)


$redis->setnx($key,time()+$expire);

# 加鎖

$redis->del($key);

# 解鎖

#新版本加鎖

#NX意思為SET IF NOT EXIST,即當(dāng)key不存在時矩肩,我們進行set操作现恼;

#若key已經(jīng)存在,則不做任何操作黍檩;

#PX意思是給這個key加一個過期設(shè)置

$redis->set($resource, $token, ['NX', 'PX' => 10 ]);


總結(jié):緩存好比防彈衣叉袍,不意味著你穿上防彈衣就可以刀槍不入,只有更好的使用緩存才會達到更好的作用刽酱,方案有很多喳逛,適合你的就是好的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末棵里,一起剝皮案震驚了整個濱河市润文,隨后出現(xiàn)的幾起案子姐呐,更是在濱河造成了極大的恐慌,老刑警劉巖典蝌,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件曙砂,死亡現(xiàn)場離奇詭異,居然都是意外死亡骏掀,警方通過查閱死者的電腦和手機鸠澈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來截驮,“玉大人笑陈,你說我怎么就攤上這事〔啻浚” “怎么了新锈?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長眶熬。 經(jīng)常有香客問我,道長块请,這世上最難降的妖魔是什么娜氏? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮墩新,結(jié)果婚禮上贸弥,老公的妹妹穿的比我還像新娘。我一直安慰自己海渊,他們只是感情好绵疲,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著臣疑,像睡著了一般盔憨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讯沈,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天郁岩,我揣著相機與錄音,去河邊找鬼缺狠。 笑死问慎,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挤茄。 我是一名探鬼主播如叼,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼穷劈!你這毒婦竟也來了笼恰?” 一聲冷哼從身側(cè)響起片酝,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挖腰,沒想到半個月后雕沿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡猴仑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年审轮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辽俗。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡疾渣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出崖飘,到底是詐尸還是另有隱情榴捡,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布朱浴,位于F島的核電站吊圾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏翰蠢。R本人自食惡果不足惜项乒,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梁沧。 院中可真熱鬧檀何,春花似錦、人聲如沸廷支。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恋拍。三九已至垛孔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芝囤,已是汗流浹背似炎。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悯姊,地道東北人羡藐。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像悯许,于是被迫代替她去往敵國和親仆嗦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348