高并發(fā)下先操作數(shù)據(jù)庫還是先操作緩存索绪?

前言

在分布式系統(tǒng)中,緩存和數(shù)據(jù)庫同時存在時贫悄,如果有寫操作的時候瑞驱,先操作數(shù)據(jù)庫還是先操作緩存呢?
先思考一下窄坦,可能會存在哪些問題唤反,再往下看晰筛。下面我分幾種方案闡述。

緩存維護方案一

假設(shè)有一寫(線程A)一讀(線程B)操作拴袭,先操作緩存读第,在操作數(shù)據(jù)庫,如下流程圖所示

圖1

1)線程A發(fā)起一個寫操作拥刻,第一步del cache
2)線程A第二步寫入新數(shù)據(jù)到DB
3)線程B發(fā)起一個讀操作怜瞒,cache miss,
4)線程B從DB獲取最新數(shù)據(jù)
5)請求B同時set cache
這樣看般哼,沒啥問題吴汪。我們再看第二個流程圖,如下:
圖2

1)線程A發(fā)起一個寫操作蒸眠,第一步del cache
2)此時線程B發(fā)起一個讀操作漾橙,cache miss
3)線程B繼續(xù)讀DB,讀出來一個老數(shù)據(jù)
4)然后老數(shù)據(jù)入cache
5)線程A寫入了最新的數(shù)據(jù)
OK楞卡,醬紫霜运,就有問題了吧,老數(shù)據(jù)入到緩存了蒋腮,每次讀都是老數(shù)據(jù)啦淘捡,緩存與數(shù)據(jù)與數(shù)據(jù)庫數(shù)據(jù)不一致。

緩存維護方案二

雙寫操作池摧,先操作緩存焦除,在操作數(shù)據(jù)庫。

圖3

1)線程A發(fā)起一個寫操作作彤,第一步set cache
2)線程B發(fā)起一個寫操作膘魄,第一步setcache
3)線程B寫入數(shù)據(jù)庫到DB
4)線程A寫入數(shù)據(jù)庫到DB
執(zhí)行完后,緩存保存的是B操作后的數(shù)據(jù)竭讳,數(shù)據(jù)庫是A操作后的數(shù)據(jù)创葡,緩存和數(shù)據(jù)庫數(shù)據(jù)不一致。

緩存維護方案三

一寫(線程A)一讀(線程B)操作代咸,先操作數(shù)據(jù)庫蹈丸,再操作緩存。

圖4

1)線程A發(fā)起一個寫操作呐芥,第一步write DB
2)線程A第二步del cache
3)線程B發(fā)起一個讀操作逻杖,cache miss
4)線程B從DB獲取最新數(shù)據(jù)
5)線程B同時set cache
這種方案沒有明顯的并發(fā)問題,但是有可能步驟二刪除緩存失敗思瘟,雖然概率比較小荸百,優(yōu)于方案一和方案二,平時工作中也是使用方案三滨攻。

綜上對比够话,我們一般采用方案三蓝翰,但是有沒有完美全解決方案三的弊端的方法呢?

緩存維護方案四

這個是方案三的改進方案女嘲,都是先操作數(shù)據(jù)庫再操作緩存畜份,我們來看一下流程圖:

圖5

通過數(shù)據(jù)庫的binlog異步淘汰key,以mysql為例欣尼,可以使用阿里的canal將binlog日志采集發(fā)送到MQ隊列里面爆雹,然后通過ACK機制確認處理 這條更新消息,刪除緩存愕鼓,保證數(shù)據(jù)緩存一致性钙态。

但是呢還有個問題,如果是主從數(shù)據(jù)庫呢菇晃?

緩存維護方案五

主從DB問題:因為主從DB同步存在同時延時時間如果刪除緩存之后册倒,數(shù)據(jù)同步到備庫之前已經(jīng)有請求過來時,會從備庫中讀到臟數(shù)據(jù)磺送,如何解決呢驻子?

解決方案如下流程圖:


圖6

緩存維護總結(jié)

綜上所述,在分布式系統(tǒng)中册着,緩存和數(shù)據(jù)庫同時存在時拴孤,如果有寫操作的時候,先操作數(shù)據(jù)庫甲捏,再操作緩存。如下:

(1)讀取緩存中是否有相關(guān)數(shù)據(jù)
(2)如果緩存中有相關(guān)數(shù)據(jù)value鞭执,則返回
(3)如果緩存中沒有相關(guān)數(shù)據(jù)司顿,則從數(shù)據(jù)庫讀取相關(guān)數(shù)據(jù)放入緩存中key->value,再返回
(4)如果有更新數(shù)據(jù)兄纺,則先更新數(shù)據(jù)大溜,再刪除緩存
(5)為了保證第四步刪除緩存成功,使用binlog異步刪除
(6)如果是主從數(shù)據(jù)庫估脆,binglog取自于從庫
(7)如果是一主多從钦奋,每個從庫都要采集binlog,然后消費端收到最后一臺binlog數(shù)據(jù)才刪除緩存

-----------------------------------------------------作者--------------------------------------------
VX公眾號搜索:撿田螺的小男孩

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疙赠,一起剝皮案震驚了整個濱河市付材,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌圃阳,老刑警劉巖厌衔,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捍岳,居然都是意外死亡富寿,警方通過查閱死者的電腦和手機睬隶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來页徐,“玉大人苏潜,你說我怎么就攤上這事”溆拢” “怎么了恤左?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贰锁。 經(jīng)常有香客問我赃梧,道長,這世上最難降的妖魔是什么豌熄? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任授嘀,我火速辦了婚禮,結(jié)果婚禮上锣险,老公的妹妹穿的比我還像新娘蹄皱。我一直安慰自己,他們只是感情好芯肤,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布巷折。 她就那樣靜靜地躺著,像睡著了一般崖咨。 火紅的嫁衣襯著肌膚如雪锻拘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天击蹲,我揣著相機與錄音署拟,去河邊找鬼。 笑死歌豺,一個胖子當著我的面吹牛推穷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播类咧,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼馒铃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了痕惋?” 一聲冷哼從身側(cè)響起区宇,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎血巍,沒想到半個月后萧锉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡述寡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年柿隙,在試婚紗的時候發(fā)現(xiàn)自己被綠了叶洞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡禀崖,死狀恐怖衩辟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情波附,我是刑警寧澤艺晴,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站掸屡,受9級特大地震影響封寞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仅财,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一狈究、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盏求,春花似錦抖锥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荆烈,卻和暖如春拯勉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背憔购。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工谜喊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人倦始。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像山卦,于是被迫代替她去往敵國和親鞋邑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353