數(shù)據(jù)庫跟緩存的雙寫一致性

1 關(guān)于一致性

為加速系統(tǒng)性能一般都會引入緩存機制,比如 Redis坏快。這種情況下當(dāng)用戶讀數(shù)據(jù)時一般會按照如下流程:


讀流程

關(guān)于讀的流程大家是沒有異議的姐仅,但是對于數(shù)據(jù)的更新呢,如何操作才算合理呢黍瞧?

1. 先更新數(shù)據(jù)庫再更新緩存。

2. 先刪緩存再更新數(shù)據(jù)庫芽偏。

3. 先更新數(shù)據(jù)庫再刪緩存雷逆。

2 一致性解決方法

2.1 緩存TTL

簡單直接又暴力的方法,如果有些數(shù)據(jù)不重要污尉,我們讀完一次數(shù)據(jù)到緩存后設(shè)置個TTL即可膀哲,等待超時后緩存自動從數(shù)據(jù)庫讀取下數(shù)據(jù)。

2.2 先更新數(shù)據(jù)庫 再更新緩存

假如我們有A被碗、B兩個請求某宪,A請求將age = 14,B請求將age = 12锐朴。我們看下正常執(zhí)行跟非正常執(zhí)行情況:


緩存舊數(shù)據(jù)

可發(fā)現(xiàn)如果出現(xiàn)網(wǎng)絡(luò)震蕩會導(dǎo)致緩存的數(shù)據(jù)是舊數(shù)據(jù)兴喂。因此這種方法不可取。并且如果是如下場景也不合適:

1. 寫場景多而讀場景少的業(yè)務(wù)需求焚志,此時緩存不是經(jīng)常性地讀衣迷,卻被頻繁的更新。

2. 如果緩存的數(shù)據(jù)是經(jīng)過各種復(fù)雜計算后寫入的酱酬,那每次寫入緩存都要運算一次壶谒,此法不可取。

2.3 先刪緩存 再更新數(shù)據(jù)庫

假如A先請求更改數(shù)據(jù)膳沽,B請求讀數(shù)據(jù)汗菜,如果因為網(wǎng)絡(luò)導(dǎo)致發(fā)生如下情況也會造成緩存臟數(shù)據(jù),如果此時緩存沒有設(shè)置TTL那會一直是臟數(shù)據(jù)挑社。


緩存臟數(shù)據(jù)

上面這種情況如何解決呢陨界?一般可以采用延時雙刪策略,他的核心執(zhí)行流程如下:

public?void?write(String key,Object value){

?redis.delKey(key);

?db.updateValue(value);

?Thread.sleep(1000);?// 再次刪除

?redis.delKey(key);

}

該思路落實到流程圖上如下所示:


延時雙刪策略

sleep的時間要根據(jù)業(yè)務(wù)數(shù)據(jù)邏輯耗時而定痛阻,反正目的是確保讀請求結(jié)束菌瘪,寫請求可以刪除讀請求造成的緩存臟數(shù)據(jù)。

當(dāng)然如果用的是主從解讀架構(gòu)阱当,那處理思路跟上面類似麻车,無非就是休眠時間再加上主從同步的時間即可缀皱。


主從模式二次刪除

可是其實第二次刪除還是有不妥的地方:

1. 二次刪除前面涉及到休眠斗这,可能導(dǎo)致系統(tǒng)性能降低动猬,可以采用異步的方式,再起一個線程來進行異步刪除表箭。

2. 如果二次刪除失敗了赁咙,還是會導(dǎo)致緩存臟數(shù)據(jù)存在的啊免钻!

2.4 先更新數(shù)據(jù)庫 再刪緩存

針對緩存更新問題彼水,老外提出了一個名為《Cache-Aside pattern》的緩存更新套路,該策略在Facebook中也廣泛使用极舔,該策略指出:

失效:應(yīng)用程序先從緩存取數(shù)據(jù)凤覆,沒有得到,則從數(shù)據(jù)庫中取數(shù)據(jù)拆魏,成功后盯桦,放到緩存中。

命中:應(yīng)用程序從緩存中取數(shù)據(jù)渤刃,取到后返回拥峦。

更新:先把數(shù)據(jù)存到數(shù)據(jù)庫中,成功后卖子,再讓緩存失效略号。

假如此時A、B兩個線程同時請求洋闽,正常來講不管你是讀寫分離還是單機版玄柠,讀一般比寫快。那刪除緩存一般是有效的诫舅。


先更新數(shù)據(jù)庫再刪除緩存

但是也有可能別的原因?qū)е伦x比寫還慢羽利,導(dǎo)致我們刪了個寂寞,雖然這種情況很少發(fā)生骚勘。


讀比寫還慢時

該方案相比先刪除緩存再更新數(shù)據(jù)庫還是穩(wěn)妥些的铐伴,但是也不是萬無一失的。不管是先刪緩存再更新數(shù)據(jù)庫還是先更新數(shù)據(jù)庫再刪緩存俏讹,如果刪除緩存失敗了都會導(dǎo)致緩存跟數(shù)據(jù)不一致問題当宴!

2.5 消息隊列 確保消息刪除

通過消息隊列的確認(rèn)消費機制來刪除緩存。


消息隊列機制確保刪除

缺點也很明顯:

對業(yè)務(wù)線代碼造成大量的侵入泽疆,引入了中間件户矢。

消息的延遲刪除也會造成短暫的不一致。

2.6 專門程序+消息隊列 確保消息刪除

該方案啟動一個訂閱程序去訂閱數(shù)據(jù)庫的binlog殉疼,獲得需要操作的數(shù)據(jù)梯浪。在應(yīng)用程序中捌年,另起一段程序,獲得這個訂閱程序傳來的信息挂洛,進行刪除緩存操作礼预。


專門程序刪除緩存

訂閱binlog程序在mysql中有現(xiàn)成的中間件叫canal,可以完成訂閱binlog日志的功能虏劲。

3 總結(jié)

分析后你會發(fā)現(xiàn)數(shù)據(jù)更新時緩存是刪除不是更新托酸,而刪除緩存一般有三種方法:

如果緩存數(shù)據(jù)不敏感,直接給緩存設(shè)置TTL即可柒巫。

先刪緩存再更新數(shù)據(jù)庫励堡,此時需配合延時雙刪技術(shù),但可能導(dǎo)致二次刪除失敗堡掏。

先更新數(shù)據(jù)庫再刪緩存应结,此時需配合binlog消費 + 消息隊列來實現(xiàn)。

https://www.toutiao.com/i6949331450177143303/?tt_from=weixin&utm_campaign=client_share&wxshare_count=1&timestamp=1618218230&app=news_article&utm_source=weixin&utm_medium=toutiao_android&use_new_style=1&req_id=202104121703500102120452302308A337&share_token=1358aaf7-f19c-4816-b1fe-b9c86865751e&group_id=6949331450177143303&wid=1618218250881

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泉唁,一起剝皮案震驚了整個濱河市鹅龄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌游两,老刑警劉巖砾层,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贱案,居然都是意外死亡肛炮,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門宝踪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侨糟,“玉大人,你說我怎么就攤上這事瘩燥★踔兀” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵厉膀,是天一觀的道長溶耘。 經(jīng)常有香客問我,道長服鹅,這世上最難降的妖魔是什么凳兵? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮企软,結(jié)果婚禮上庐扫,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好形庭,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布铅辞。 她就那樣靜靜地躺著,像睡著了一般萨醒。 火紅的嫁衣襯著肌膚如雪斟珊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天验靡,我揣著相機與錄音倍宾,去河邊找鬼。 笑死胜嗓,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钩乍。 我是一名探鬼主播辞州,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寥粹!你這毒婦竟也來了变过?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤涝涤,失蹤者是張志新(化名)和其女友劉穎媚狰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阔拳,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡崭孤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了糊肠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辨宠。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖货裹,靈堂內(nèi)的尸體忽然破棺而出嗤形,到底是詐尸還是另有隱情,我是刑警寧澤弧圆,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布赋兵,位于F島的核電站,受9級特大地震影響搔预,放射性物質(zhì)發(fā)生泄漏霹期。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一斯撮、第九天 我趴在偏房一處隱蔽的房頂上張望经伙。 院中可真熱鬧,春花似錦、人聲如沸帕膜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垮刹。三九已至达吞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荒典,已是汗流浹背酪劫。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寺董,地道東北人覆糟。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像遮咖,于是被迫代替她去往敵國和親滩字。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

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