緩存常見問題這一篇就夠了

一皂林、緩存架構(gòu)

緩存架構(gòu)

上圖是之前項(xiàng)目的緩存架構(gòu)蜈七,加了二個(gè)級別的緩存:進(jìn)程內(nèi)緩存柴底、分布式緩存婿脸。

讀操作的思路:判斷該緩存是否開啟了進(jìn)程內(nèi)緩存的開關(guān),開了則先讀進(jìn)程內(nèi)緩存柄驻,沒有則讀分布式緩存狐树,若還是沒有就讀DB;

二鸿脓、進(jìn)程內(nèi)緩存

2.1抑钟、進(jìn)程內(nèi)緩存的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):與分布式緩存相比較,因?yàn)榫彺鏀?shù)據(jù)存儲(chǔ)在站點(diǎn)內(nèi)野哭,所以減少了一次網(wǎng)絡(luò)開銷在塔。

缺點(diǎn):分布式緩存雖然多了一次網(wǎng)絡(luò)開銷,但是數(shù)據(jù)仍然是統(tǒng)一存儲(chǔ)的拨黔,而進(jìn)程內(nèi)緩存的數(shù)據(jù)存了多份蛔溃,這會(huì)導(dǎo)致數(shù)據(jù)修改時(shí)數(shù)據(jù)不一致性窗口比分布式緩存要長,一致性難保障篱蝇。

2.2贺待、如何解決進(jìn)程內(nèi)緩存的數(shù)據(jù)一致性問題?

(1)零截、將更改的通知寫進(jìn)MQ狠持,讓所有站點(diǎn)訂閱,然后站點(diǎn)自己去DB讀取最新的數(shù)據(jù)

(2)瞻润、若是RPC框架,則用RPC框架的廣播功能通知所有站點(diǎn),站點(diǎn)自己再去讀取DB

2.3绍撞、為什么為什么不能頻繁使用進(jìn)程內(nèi)緩存正勒?

分層架構(gòu)設(shè)計(jì),有一條準(zhǔn)則:站點(diǎn)層傻铣、服務(wù)層要做到無數(shù)據(jù)無狀態(tài)章贞,這樣才能任意的加節(jié)點(diǎn)水平擴(kuò)展,數(shù)據(jù)和狀態(tài)盡量存儲(chǔ)到后端的數(shù)據(jù)存儲(chǔ)服務(wù)非洲,例如數(shù)據(jù)庫服務(wù)或者緩存服務(wù)鸭限。

顯然進(jìn)程內(nèi)緩存違背了這一原則。

2.4两踏、什么時(shí)候適合用進(jìn)程內(nèi)緩存败京?

只讀數(shù)據(jù),例如配置數(shù)據(jù)梦染,由于這些數(shù)據(jù)一般不會(huì)修改赡麦,所以可以考慮使用進(jìn)程內(nèi)緩存。

總結(jié):進(jìn)程內(nèi)緩存最大的問題是一致性難以保障帕识,比較適合保存只讀數(shù)據(jù)泛粹。大部分場景使用進(jìn)程內(nèi)緩存的情況下,都可以改用分布式緩存肮疗。

三晶姊、分布式緩存

3.1、寫操作時(shí)伪货,緩存應(yīng)該淘汰们衙,還是修改?

(1)超歌、修改緩存

a砍艾、可以減少一次cache miss,但是會(huì)加大業(yè)務(wù)處理的響應(yīng)

b巍举、最嚴(yán)重的是脆荷,在寫并發(fā)時(shí)還可能會(huì)出現(xiàn)緩存數(shù)據(jù)錯(cuò)誤

在1和2兩個(gè)并發(fā)寫發(fā)生時(shí),由于無法保證時(shí)序懊悯,此時(shí)不管先操作緩存還是先操作數(shù)據(jù)庫蜓谋,都可能出現(xiàn):

i、請求1先操作數(shù)據(jù)庫炭分,請求2后操作數(shù)據(jù)庫

ii桃焕、請求2先set了緩存,請求1后set了緩存

導(dǎo)致捧毛,數(shù)據(jù)庫與緩存之間的數(shù)據(jù)不一致观堂。

(2)让网、淘汰緩存

會(huì)讓讀數(shù)據(jù)時(shí)多了一次cache miss。

總結(jié):淘汰緩存师痕。一般的情況下讀數(shù)據(jù)時(shí)多一次cache miss并不會(huì)有問題溃睹,僅僅是加大了響應(yīng)時(shí)間,由于硬件水品的提高胰坟,一般情況下感受不到因篇。

3.2、寫操作時(shí)笔横,先操作數(shù)據(jù)庫竞滓,還是先操作緩存?

希望保證兩個(gè)操作的原子性吹缔,要么同時(shí)成功商佑,要么同時(shí)失敗。

這演變?yōu)橐粋€(gè)分布式事務(wù)的問題涛菠,保證原子性十分困難莉御,很有可能出現(xiàn)一半成功,一半失敗俗冻,接下來看下礁叔,當(dāng)原子性被破壞的時(shí)候,分別會(huì)發(fā)生什么迄薄。

(1)琅关、先淘汰緩存、后操作數(shù)據(jù)庫

第1步失敗讥蔽,第2步成功涣易,會(huì)導(dǎo)致,緩存里的還是舊數(shù)據(jù)冶伞,數(shù)據(jù)庫的是新數(shù)據(jù)新症,業(yè)務(wù)無法接受。若第1步成功响禽,第2步失敗徒爹,會(huì)導(dǎo)致緩存清空了,數(shù)據(jù)庫還是舊數(shù)據(jù)芋类,也只是會(huì)多一次cache miss而已隆嗅,試想一下這里是更新緩存會(huì)有什么后果,所以這也是為什么建議淘汰緩存而不是修改緩存的原因之一侯繁。

(2)胖喳、先操作數(shù)據(jù)庫、后淘汰緩存

第1步成功贮竟,第2步失敗丽焊,會(huì)導(dǎo)致较剃,數(shù)據(jù)庫里是新數(shù)據(jù),而緩存里是舊數(shù)據(jù)粹懒,業(yè)務(wù)無法接受重付。若第1步失敗就可以回滾,不會(huì)出現(xiàn)數(shù)據(jù)不一致凫乖。

因?yàn)閞edis操作和mysql操作不在一個(gè)事務(wù)里面,所以保證原子性較麻煩弓颈,有人可能想到用分布式事務(wù)帽芽,但是大可不必∠杓剑可以采用一方方法导街,即當(dāng)redis操作失敗時(shí),手動(dòng)拋出運(yùn)行時(shí)異常纤子。

要注意的是先淘汰緩存搬瑰,后操作數(shù)據(jù)庫,還可能會(huì)導(dǎo)致如下坑:

當(dāng)讀寫并發(fā)時(shí)會(huì)出問題控硼。淘汰緩存后泽论,數(shù)據(jù)庫更新事務(wù)提交前,若有讀操作卡乾,則會(huì)從數(shù)據(jù)庫中讀取舊數(shù)據(jù)存到緩存翼悴,之后數(shù)據(jù)事務(wù)提交,可是舊數(shù)據(jù)會(huì)一直存放在緩存中幔妨。

總結(jié):先操作數(shù)據(jù)庫鹦赎,后淘汰緩存

3.3、DB主從架構(gòu)下導(dǎo)致的緩存與DB數(shù)據(jù)不一致性

(1)误堡、為什么出現(xiàn)不一致性

主從同步有延時(shí)古话,在延期的期間,發(fā)生cache miss后讀取了從庫锁施,就會(huì)導(dǎo)致數(shù)據(jù)不一致性了陪踩。本質(zhì)就是數(shù)據(jù)庫主從同步延時(shí)。

(2)沾谜、該情況的數(shù)據(jù)不一致性不良影響

沒有緩存架構(gòu)下時(shí)膊毁,數(shù)據(jù)庫主從延時(shí),只會(huì)導(dǎo)致同步期間短暫的數(shù)據(jù)不一致性基跑,當(dāng)同步完成后婚温,不一致性不存在。而有了緩存后媳否,緩存寫進(jìn)了不一致性的從庫數(shù)據(jù)栅螟,當(dāng)數(shù)據(jù)庫同步完成后數(shù)據(jù)不一致性一直存在荆秦,直到緩存過期×ν迹可見加入緩存后步绸,這個(gè)問題不出力妥當(dāng),影響會(huì)很糟糕吃媒。能不能使得加入緩存后瓤介,數(shù)據(jù)不一致性的時(shí)間與每加入緩存相當(dāng)呢?

(3)赘那、解決辦法

a刑桑、主從同步;

b募舟、通過工具訂閱從庫的binlog祠斧,這里能夠最準(zhǔn)確的知道,從庫數(shù)據(jù)同步完成的時(shí)間拱礁。訂閱工具是DTS琢锋,可以是cannal,也可以自己訂閱和分析binlog呢灶;

c吴超、從庫執(zhí)行完寫操作,向緩存再次發(fā)起刪除填抬,淘汰這段時(shí)間內(nèi)可能寫入緩存的舊數(shù)據(jù)烛芬;

總結(jié):該辦法也只能優(yōu)化,并不能消除數(shù)據(jù)不一致性飒责。

3.4赘娄、主從數(shù)據(jù)庫不一致解決方法

主從數(shù)據(jù)庫不一致性的根本原因就是主從數(shù)據(jù)庫同步延遲。

解決方法如下

(1)宏蛉、忽略

業(yè)務(wù)允許范圍下遣臼,可以忽略這種段時(shí)間內(nèi)的數(shù)據(jù)不一致性。

(2)拾并、強(qiáng)制讀主

搭建高可用主庫揍堰,讀寫都在主庫,采用緩存來提高讀性能并且達(dá)到減輕數(shù)據(jù)庫壓力的目的嗅义。

(3)屏歹、選擇性讀主

強(qiáng)制讀主顯得過于粗暴,因?yàn)橹挥猩贁?shù)的寫才會(huì)導(dǎo)致這種數(shù)據(jù)不一致性之碗。

可以這樣做:

a蝙眶、寫主庫;

b褪那、將哪個(gè)庫幽纷,哪個(gè)表式塌,哪個(gè)主鍵三個(gè)信息拼裝一個(gè)key設(shè)置到cache里,這條記錄的超時(shí)時(shí)間友浸,設(shè)置為“主從同步時(shí)延”峰尝;要注意的是,?假設(shè)主從延時(shí)為1s,這個(gè)key的cache超時(shí)時(shí)間也為1s收恢。

c武学、讀操作時(shí),把哪個(gè)庫派诬,哪個(gè)表劳淆,哪個(gè)主鍵這三個(gè)信息拼裝一個(gè)key,到cache里去查詢默赂,如果有的話就讀主,沒有就讀從括勺。

四缆八、緩存使用總結(jié)

只要有數(shù)據(jù)冗余的地方,就會(huì)有數(shù)據(jù)不一致性問題疾捍。緩存的難點(diǎn)奈辰,從我接觸的來看,有兩點(diǎn):緩存不一致性乱豆、緩存數(shù)據(jù)不存在奖恰。而緩存數(shù)據(jù)不存在導(dǎo)致的問題可以分為3類:緩存穿透、緩存擊穿宛裕、緩存雪崩瑟啃。從使用的感受來看,緩存的坑還挺多的揩尸,使用時(shí)要根據(jù)業(yè)務(wù)來選擇方案蛹屿,只有符合業(yè)務(wù)的才是最好的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末岩榆,一起剝皮案震驚了整個(gè)濱河市错负,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌勇边,老刑警劉巖犹撒,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異粒褒,居然都是意外死亡识颊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門怀浆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谊囚,“玉大人怕享,你說我怎么就攤上這事×ぃ” “怎么了函筋?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奠伪。 經(jīng)常有香客問我跌帐,道長,這世上最難降的妖魔是什么绊率? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任谨敛,我火速辦了婚禮,結(jié)果婚禮上滤否,老公的妹妹穿的比我還像新娘脸狸。我一直安慰自己,他們只是感情好藐俺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布炊甲。 她就那樣靜靜地躺著,像睡著了一般欲芹。 火紅的嫁衣襯著肌膚如雪卿啡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天菱父,我揣著相機(jī)與錄音颈娜,去河邊找鬼。 笑死浙宜,一個(gè)胖子當(dāng)著我的面吹牛官辽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梆奈,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼野崇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了亩钟?” 一聲冷哼從身側(cè)響起乓梨,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎清酥,沒想到半個(gè)月后扶镀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焰轻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年臭觉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝠筑,死狀恐怖狞膘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情什乙,我是刑警寧澤挽封,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站臣镣,受9級特大地震影響辅愿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜忆某,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一点待、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弃舒,春花似錦癞埠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坝冕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瓦呼,已是汗流浹背喂窟。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留央串,地道東北人磨澡。 一個(gè)月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像质和,于是被迫代替她去往敵國和親稳摄。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

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

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,931評論 2 89
  • 理論總結(jié) 它要解決什么樣的問題饲宿? 數(shù)據(jù)的訪問厦酬、存取、計(jì)算太慢瘫想、太不穩(wěn)定仗阅、太消耗資源,同時(shí)国夜,這樣的操作存在重復(fù)性减噪。因...
    jiangmo閱讀 2,851評論 0 11
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說明:當(dāng)在唯一索引所對應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常。 O...
    我想起個(gè)好名字閱讀 5,317評論 0 9
  • Activity Activity是Android 四大組合之一筹裕,在應(yīng)用中表現(xiàn)為用戶界面醋闭,顯示各種UI元素。Act...
    一只筆閱讀 609評論 0 1
  • 《美人說》從專題設(shè)立到如今朝卒,已經(jīng)收錄了21000多篇文章证逻。投稿本專題的眾多稿件中,很多優(yōu)質(zhì)的作品被收入《美人說專題...
    覃勤勤閱讀 2,028評論 3 19