為什么你的緩存更新策略是先更新數(shù)據(jù)庫后刪除緩存亏栈,講講其他的情況有什么問題?

轉(zhuǎn)載:緩存與數(shù)據(jù)庫的一致性思考

問題:怎么保持緩存與數(shù)據(jù)庫一致宏赘?

要解答這個問題仑扑,我們首先來看不一致的幾種情況。我將不一致分為三種情況

  1. 數(shù)據(jù)庫有數(shù)據(jù)置鼻,緩存沒有數(shù)據(jù);
  2. 數(shù)據(jù)庫有數(shù)據(jù)蜓竹,緩存也有數(shù)據(jù)箕母,數(shù)據(jù)不相等;
  3. 數(shù)據(jù)庫沒有數(shù)據(jù)俱济,緩存有數(shù)據(jù)嘶是。

在討論這三種情況之前,先說明一下我使用緩存的策略蛛碌,也是大多數(shù)人使用的策略聂喇,叫做 Cache Aside Pattern。酷殼里的 緩存更新的套路 一文希太,很值得一讀克饶,我的策略也是從他那學來的。

簡而言之誊辉,就是

1. 首先嘗試從緩存讀取矾湃,讀到數(shù)據(jù)則直接返回;如果讀不到堕澄,就讀數(shù)據(jù)庫邀跃,并將數(shù)據(jù)會寫到緩存,并返回蛙紫。

2. 需要更新數(shù)據(jù)時拍屑,先更新數(shù)據(jù)庫,然后把緩存里對應的數(shù)據(jù)失效掉(刪掉)坑傅。

因為:
讀的邏輯大家都很容易理解僵驰,談談更新。如果不采取我提到的這種更新方法裁蚁,你還能想到什么更新方法呢矢渊?大概會是:先刪除緩存,然后再更新數(shù)據(jù)庫枉证。這么做引發(fā)的問題是矮男,如果A,B兩個線程同時要更新數(shù)據(jù),并且A,B已經(jīng)都做完了刪除緩存這一步室谚,接下來毡鉴,A先更新了數(shù)據(jù)庫,C線程讀取數(shù)據(jù)秒赤,由于緩存沒有猪瞬,則查數(shù)據(jù)庫,并把A更新的數(shù)據(jù)入篮,寫入了緩存陈瘦,最后B更新數(shù)據(jù)庫。那么緩存和數(shù)據(jù)庫的值就不一致了潮售。

另外有人會問痊项,如果采用你提到的方法,為什么最后是把緩存的數(shù)據(jù)刪掉酥诽,而不是把更新的數(shù)據(jù)寫到緩存里鞍泉。這么做引發(fā)的問題是,如果A,B兩個線程同時做數(shù)據(jù)更新肮帐,A先更新了數(shù)據(jù)庫咖驮,B后更新數(shù)據(jù)庫,則此時數(shù)據(jù)庫里存的是B的數(shù)據(jù)。而更新緩存的時候托修,是B先更新了緩存忘巧,而A后更新了緩存,則緩存里是A的數(shù)據(jù)诀黍。這樣緩存和數(shù)據(jù)庫的數(shù)據(jù)也不一致袋坑。

按照我提到的這種更新緩存的策略,理論上也是有不一致的風險的眯勾,酷殼的文章有提到枣宫,只不過概率很小,我們暫時可以不考慮吃环,后面我們有其他手段來補救也颤。

討論完使用緩存的策略,我們再來看這三種不一致的情況郁轻。

  1. 對于第一種翅娶,在讀數(shù)據(jù)的時候,會自動把數(shù)據(jù)庫的數(shù)據(jù)寫到緩存好唯,因此不一致自動消除

  2. 對于第二種竭沫,數(shù)據(jù)最終變成了不相等,但他們之前在某一個時間點一定是相等的(不管你使用懶加載還是預加載的方式骑篙,在緩存加載的那一刻蜕提,它一定和數(shù)據(jù)庫一致)。這種不一致靶端,一定是由于你更新數(shù)據(jù)所引發(fā)的谎势。前面我們講了更新數(shù)據(jù)的策略,先更新數(shù)據(jù)庫杨名,然后刪除緩存脏榆。因此,不一致的原因台谍,一定是數(shù)據(jù)庫更新了须喂,但是刪除緩存失敗了。

  3. 對于第三種趁蕊,情況和第二種類似坞生,你把數(shù)據(jù)庫的數(shù)據(jù)刪了,但是刪除緩存的時候失敗了介衔。

因此,最終的結(jié)論是骂因,需要解決的不一致炎咖,產(chǎn)生的原因是更新數(shù)據(jù)庫成功,但是刪除緩存失敗。

我想出的解決方案大概有以下幾種:

  1. 對刪除緩存進行重試乘盼,數(shù)據(jù)的一致性要求越高升熊,我越是重試得快。

  2. 定期全量更新绸栅,簡單地說级野,就是我定期把緩存全部清掉,然后再全量加載粹胯。

  3. 給所有的緩存一個失效期蓖柔。

第三種方案可以說是一個大殺器,任何不一致风纠,都可以靠失效期解決况鸣,失效期越短,數(shù)據(jù)一致性越高竹观。但是失效期越短镐捧,查數(shù)據(jù)庫就會越頻繁。因此失效期應該根據(jù)業(yè)務來定臭增。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末懂酱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子誊抛,更是在濱河造成了極大的恐慌列牺,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芍锚,死亡現(xiàn)場離奇詭異昔园,居然都是意外死亡,警方通過查閱死者的電腦和手機并炮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門默刚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逃魄,你說我怎么就攤上這事荤西。” “怎么了伍俘?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵邪锌,是天一觀的道長。 經(jīng)常有香客問我癌瘾,道長觅丰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任妨退,我火速辦了婚禮妇萄,結(jié)果婚禮上蜕企,老公的妹妹穿的比我還像新娘。我一直安慰自己冠句,他們只是感情好轻掩,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著懦底,像睡著了一般唇牧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上聚唐,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天丐重,我揣著相機與錄音,去河邊找鬼拱层。 笑死弥臼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的根灯。 我是一名探鬼主播径缅,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼烙肺!你這毒婦竟也來了纳猪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤桃笙,失蹤者是張志新(化名)和其女友劉穎氏堤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搏明,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡鼠锈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了星著。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片购笆。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖虚循,靈堂內(nèi)的尸體忽然破棺而出同欠,到底是詐尸還是另有隱情,我是刑警寧澤横缔,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布铺遂,位于F島的核電站,受9級特大地震影響茎刚,放射性物質(zhì)發(fā)生泄漏襟锐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一膛锭、第九天 我趴在偏房一處隱蔽的房頂上張望粮坞。 院中可真熱鬧笛质,春花似錦、人聲如沸捞蚂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姓迅。三九已至,卻和暖如春俊马,著一層夾襖步出監(jiān)牢的瞬間丁存,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工柴我, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留解寝,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓艘儒,卻偏偏與公主長得像聋伦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子界睁,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

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