緩存一致性,緩存穿透众雷,緩存擊穿灸拍,緩存雪崩解決方案分析

(1)緩存失效一致性問(wèn)題

一般緩存的使用方式是:先讀取緩存,若不存在則從DB中讀取砾省,并將結(jié)果寫入到緩存中鸡岗;下次數(shù)據(jù)讀取時(shí)便可以直接從緩存中獲取數(shù)據(jù)。

數(shù)據(jù)的修改是直接失效緩存數(shù)據(jù)编兄,再修改DB內(nèi)容轩性,避免DB修改成功,但由于網(wǎng)絡(luò)或者其他問(wèn)題導(dǎo)致緩存數(shù)據(jù)沒(méi)有清理狠鸳,造成了臟數(shù)據(jù)揣苏。但這樣仍然無(wú)法避免臟數(shù)據(jù)的產(chǎn)生,一種并發(fā)的場(chǎng)景下:假設(shè)業(yè)務(wù)對(duì)數(shù)據(jù)Key:Hello Value:World有大量的讀取和修改請(qǐng)求件舵。線程A向OCS讀取Key:Hello卸察,得到Not Found結(jié)果,開(kāi)始向DB請(qǐng)求數(shù)據(jù)铅祸,得到數(shù)據(jù)Key:Hello Value:World坑质;接下來(lái)準(zhǔn)備向OCS寫入此條數(shù)據(jù),但在寫入OCS前(網(wǎng)絡(luò),CPU都等可能導(dǎo)致A線程處理速度降低)另一B線程請(qǐng)求修改數(shù)據(jù)Key:Hello Value:OCS洪乍,首先執(zhí)行失效緩存動(dòng)作(因?yàn)锽線程并不知道是否有此條數(shù)據(jù)眯杏,因此直接執(zhí)行失效操作),OCS成功處理了失效請(qǐng)求壳澳。轉(zhuǎn)回到A線程繼續(xù)執(zhí)行寫入OCS岂贩,將Key:Hello Value:World寫入到緩存中,A線程任務(wù)結(jié)束巷波;B線程也成功修改了DB數(shù)據(jù)內(nèi)容為Key:Hello Value:OCS萎津。為了解決這個(gè)問(wèn)題,OCS擴(kuò)充了Memcached協(xié)議(公有云即將支持)抹镊,增加了deleteAndIncVersion接口锉屈。此接口并不會(huì)真的刪除數(shù)據(jù),而是給數(shù)據(jù)打了標(biāo)簽垮耳,表明已失效狀態(tài)颈渊,并且增加數(shù)據(jù)版本號(hào);如果數(shù)據(jù)不存在則寫入NULL终佛,同時(shí)也生成隨機(jī)數(shù)據(jù)版本號(hào)俊嗽。OCS寫入支持原子對(duì)比版本號(hào):假設(shè)傳入的版本號(hào)與OCS保存的數(shù)據(jù)版本號(hào)一致或者原數(shù)據(jù)不存在,則準(zhǔn)許寫入铃彰,否則拒絕修改绍豁。

回到剛才的場(chǎng)景上:線程A向OCS讀取Key:Hello,得到Not Found結(jié)果牙捉,開(kāi)始向DB請(qǐng)求數(shù)據(jù)竹揍,得到數(shù)據(jù)Key:Hello Value:World;接下來(lái)準(zhǔn)備向OCS寫入此條數(shù)據(jù)邪铲,版本號(hào)信息默認(rèn)為1芬位;在A寫入OCS前另一個(gè)B線程發(fā)起了動(dòng)作修改數(shù)據(jù)Key:Hello Value:OCS,首先執(zhí)行刪除緩存動(dòng)作霜浴,OCS順利處理了deleteAndIncVersion請(qǐng)求晶衷,生成了隨機(jī)版本號(hào)12345(約定大于1000)蓝纲。轉(zhuǎn)回到A線程繼續(xù)執(zhí)行寫入OCS阴孟,請(qǐng)求將Key:Hello Value:World寫入,此時(shí)緩存系統(tǒng)發(fā)現(xiàn)傳入的版本號(hào)信息不匹配(1 K懊浴= 12345)永丝,寫入失敗,A線程任務(wù)結(jié)束箭养;B線程也成功修改了DB數(shù)據(jù)內(nèi)容為Key:Hello Value:OCS慕嚷。

此時(shí)OCS中的數(shù)據(jù)為Key:Hello Value:NULL Version:12345;DB中的數(shù)據(jù)為Key:Hello Value:OCS,后續(xù)讀任務(wù)時(shí)會(huì)再次嘗試將DB中的數(shù)據(jù)寫入到OCS中喝检。

(2)緩存數(shù)據(jù)的寫同步的與DB一致性問(wèn)題

隨著網(wǎng)站規(guī)模增長(zhǎng)和可靠性的提升嗅辣,會(huì)面臨多IDC的部署,每個(gè)IDC都有一套獨(dú)立的DB和緩存系統(tǒng)挠说,這時(shí)緩存一致性又成了突出的問(wèn)題澡谭。

首先緩存系統(tǒng)為了保證高效率,會(huì)杜絕磁盤IO损俭,哪怕是寫B(tài)INLOG蛙奖;當(dāng)然緩存系統(tǒng)為了性能可以只同步刪除,不同步寫入杆兵,那么緩存的同步一般會(huì)優(yōu)先于DB同步到達(dá)(畢竟緩存系統(tǒng)的效率要高得多)雁仲,那么就會(huì)出現(xiàn)緩存中無(wú)數(shù)據(jù),DB中是舊數(shù)據(jù)的場(chǎng)景琐脏。此時(shí)攒砖,有業(yè)務(wù)請(qǐng)求數(shù)據(jù),讀取緩存Not Found日裙,從DB讀取并加載到緩存中的仍然是舊數(shù)據(jù)祭衩,DB數(shù)據(jù)同步到達(dá)時(shí)也只更新了DB,緩存臟數(shù)據(jù)無(wú)法被清除阅签。

image.jpeg

從上面的情況可以看出掐暮,不一致的根本原因是異構(gòu)系統(tǒng)之間無(wú)法協(xié)同同步,不能保證DB數(shù)據(jù)先同步政钟,緩存數(shù)據(jù)后同步路克。所以就要考慮緩存系統(tǒng)如何等待DB同步,或者能否做到兩者共用一套同步機(jī)制养交?緩存同步也依賴DB BINLOG是一個(gè)可行的方案精算。

IDC1中的DB,通過(guò)BINLOG同步給IDC2中的DB碎连,此事IDC2-DB數(shù)據(jù)修改也會(huì)產(chǎn)生自身的BINLOG灰羽,緩存的數(shù)據(jù)同步就可以通過(guò)IDC2-DB BINLOG進(jìn)行。緩存同步模塊分析BINLOG后鱼辙,失效相應(yīng)的緩存Key廉嚼,同步從并行改為串行,保證了先后順序倒戏。

(3)緩存穿透(DB承受了沒(méi)有必要的查詢流量)

方法一:是布隆過(guò)濾器怠噪。它是一種空間效率極高的概率型算法和數(shù)據(jù)結(jié)構(gòu),用于判斷一個(gè)元素是否在集合中(類似Hashset)杜跷。它的核心是一個(gè)很長(zhǎng)的二進(jìn)制向量和一系列的hash函數(shù)傍念。使用谷歌的guava實(shí)現(xiàn)布隆過(guò)濾器矫夷。1)存在誤算率,隨著存入的元素?cái)?shù)量增加憋槐,誤算率也隨著增加2)一般情況下不能從布隆過(guò)濾器刪除元素3)數(shù)組長(zhǎng)度以及hash函數(shù)個(gè)數(shù)確定過(guò)程復(fù)雜双藕,布隆過(guò)濾器的使用場(chǎng)景?1)垃圾郵件地址過(guò)濾(地址數(shù)量很龐大)2)爬蟲(chóng)URL地址去重3)解決緩存擊穿問(wèn)題

方法二:存儲(chǔ)空結(jié)果阳仔,并設(shè)置空結(jié)果的時(shí)間

(4)緩存雪崩(緩存設(shè)置同一過(guò)期時(shí)間蔓彩,引起的DB洪峰)

方法一:大多數(shù)系統(tǒng)設(shè)計(jì)者考慮用加鎖或者隊(duì)列的方式保證緩存的單線 程(進(jìn)程)寫,從而避免失效時(shí)大量的并發(fā)請(qǐng)求落到底層存儲(chǔ)系統(tǒng)上
方法二:失效時(shí)間隨機(jī)值

(5)緩存擊穿(熱點(diǎn)Key驳概,大量并發(fā)讀請(qǐng)求引起的小雪崩)

    緩存在某個(gè)時(shí)間點(diǎn)過(guò)期的時(shí)候赤嚼,恰好在這個(gè)時(shí)間點(diǎn)對(duì)這個(gè)Key有大量的并發(fā)請(qǐng)求過(guò)來(lái),這些請(qǐng)求發(fā)現(xiàn)緩存過(guò)期一般都會(huì)從后端DB加載數(shù)據(jù)并回設(shè)到緩存顺又,這個(gè)時(shí)候大并發(fā)的請(qǐng)求可能會(huì)瞬間把后端DB壓垮

方法一:1.使用分布是緩存支持的互斥鎖(mutex key)更卒,去set一個(gè)mutex key,當(dāng)操作返回成功時(shí)稚照,再進(jìn)行l(wèi)oad db的操作并回設(shè)緩存蹂空,也就是load DB 只會(huì)一個(gè)線程處理。
方法二:提前"使用互斥鎖(mutex key):在value內(nèi)部設(shè)置1個(gè)超時(shí)值(timeout1), timeout1比實(shí)際的memcache timeout(timeout2)小果录。當(dāng)從cache讀取到timeout1發(fā)現(xiàn)它已經(jīng)過(guò)期時(shí)候上枕,馬上延長(zhǎng)timeout1并重新設(shè)置到cache。然后再?gòu)臄?shù)據(jù)庫(kù)加載數(shù)據(jù)并設(shè)置到cache中弱恒。增加了業(yè)務(wù)代碼的侵入過(guò)多辨萍,以及增加了編碼復(fù)雜性
方法三: "永遠(yuǎn)不過(guò)期": 從redis上看,確實(shí)沒(méi)有設(shè)置過(guò)期時(shí)間返弹,這就保證了锈玉,不會(huì)出現(xiàn)熱點(diǎn)key過(guò)期問(wèn)題,也就是“物理”不過(guò)期义起。從功能上看拉背,如果不過(guò)期,那不就成靜態(tài)的了嗎默终?所以我們把過(guò)期時(shí)間存在key對(duì)應(yīng)的value里椅棺,如果發(fā)現(xiàn)要過(guò)期了,通過(guò)一個(gè)后臺(tái)的異步線程進(jìn)行緩存的構(gòu)建齐蔽,也就是“邏輯”過(guò)期

(6)緩存系統(tǒng)常見(jiàn)的緩存滿了和數(shù)據(jù)丟失問(wèn)題

需要根據(jù)具體業(yè)務(wù)分析两疚,通常我們采用LRU策略處理溢出,Redis的RDB和AOF持久化策略來(lái)保證一定情況下的數(shù)據(jù)安全肴熏。

本文參考:

https://www.csdn.net/article/1970-01-01/2825234

https://blog.csdn.net/zeb_perfect/article/details/54135506

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鬼雀,一起剝皮案震驚了整個(gè)濱河市顷窒,隨后出現(xiàn)的幾起案子蛙吏,更是在濱河造成了極大的恐慌源哩,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸦做,死亡現(xiàn)場(chǎng)離奇詭異励烦,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)泼诱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門坛掠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人治筒,你說(shuō)我怎么就攤上這事屉栓。” “怎么了耸袜?”我有些...
    開(kāi)封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵友多,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我堤框,道長(zhǎng)域滥,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任蜈抓,我火速辦了婚禮启绰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沟使。我一直安慰自己委可,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布腊嗡。 她就那樣靜靜地躺著撤缴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叽唱。 梳的紋絲不亂的頭發(fā)上屈呕,一...
    開(kāi)封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音棺亭,去河邊找鬼虎眨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛镶摘,可吹牛的內(nèi)容都是我干的嗽桩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼凄敢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼碌冶!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起涝缝,我...
    開(kāi)封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤扑庞,失蹤者是張志新(化名)和其女友劉穎譬重,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體罐氨,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡臀规,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了栅隐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塔嬉。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖租悄,靈堂內(nèi)的尸體忽然破棺而出谨究,到底是詐尸還是另有隱情,我是刑警寧澤泣棋,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布记盒,位于F島的核電站,受9級(jí)特大地震影響外傅,放射性物質(zhì)發(fā)生泄漏纪吮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一萎胰、第九天 我趴在偏房一處隱蔽的房頂上張望碾盟。 院中可真熱鬧,春花似錦技竟、人聲如沸冰肴。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)熙尉。三九已至,卻和暖如春搓扯,著一層夾襖步出監(jiān)牢的瞬間检痰,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工锨推, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铅歼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓换可,卻偏偏與公主長(zhǎng)得像椎椰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沾鳄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,373評(píng)論 8 265
  • 42慨飘、PHP緩存技術(shù)有哪些?1)译荞、全頁(yè)面靜態(tài)化緩存2)瓤的、頁(yè)面部分緩存3)休弃、數(shù)據(jù)緩存4)、查詢緩存5)堤瘤、按內(nèi)容變更進(jìn)...
    像敏銳的狗閱讀 756評(píng)論 1 2
  • 【執(zhí)子之手】2017年12月5日 璨璨+Tina 小小書語(yǔ)者 Day28 1玫芦、今天早起寶寶精神頭稍微好點(diǎn)浆熔,但不比平...
    cancan媽閱讀 136評(píng)論 0 0
  • 有人的地方就有江湖本辐,有江湖的地方就有鄙視鏈。 寫作是人寫的医增,所以寫作也有鄙視鏈慎皱。 寫詩(shī)的看不起寫小說(shuō)的。因?yàn)樵?shī)是最...
    牛皮社閱讀 8,671評(píng)論 106 144
  • 真正的進(jìn)取需要: 1叶骨、建立長(zhǎng)期意識(shí),茫多,凡事多從長(zhǎng)遠(yuǎn)利益的角度去思考,避免短視思維忽刽,不會(huì)為了圖一時(shí)之快而浪費(fèi)自己寶貴...
    海蓉sarah閱讀 472評(píng)論 0 1