如何保持MySQL和Redis的一致性

一墓怀、一致性問題

在高并發(fā)的業(yè)務(wù)場(chǎng)景下榴嗅,數(shù)據(jù)庫大多數(shù)情況都是用戶并發(fā)訪問最薄弱的環(huán)節(jié)潘鲫。所以,就需要使用redis做一個(gè)緩沖操作总珠,讓請(qǐng)求先訪問到redis,而不是直接訪問MySQL等數(shù)據(jù)庫勘纯。

讀取緩存步驟一般沒有什么問題局服,但是一旦涉及到數(shù)據(jù)更新:數(shù)據(jù)庫和緩存更新,就容易出現(xiàn)緩存(Redis)和數(shù)據(jù)庫(MySQL)間的數(shù)據(jù)一致性問題驳遵。

不管是先寫MySQL數(shù)據(jù)庫淫奔,再刪除Redis緩存;還是先刪除緩存堤结,再寫庫唆迁,都有可能出現(xiàn)數(shù)據(jù)不一致的情況。舉一個(gè)例子:

1.如果刪除了緩存Redis竞穷,還沒有來得及寫庫MySQL唐责,另一個(gè)線程(線程B)就來讀取,發(fā)現(xiàn)緩存為空瘾带,則去數(shù)據(jù)庫中讀取數(shù)據(jù)寫入緩存鼠哥,此時(shí)緩存中為臟數(shù)據(jù)。

2.如果先寫了庫看政,在刪除緩存前朴恳,寫庫的線程宕機(jī)了,沒有刪除掉緩存允蚣,則也會(huì)出現(xiàn)數(shù)據(jù)不一致情況于颖。或者先寫了庫嚷兔,在刪除緩存之前森渐,另一個(gè)線程(線程B)就來讀取,讀取緩存的數(shù)據(jù)為舊數(shù)據(jù)谴垫。

因?yàn)閷懞妥x是并發(fā)的章母,沒法保證順序,就會(huì)出現(xiàn)緩存和數(shù)據(jù)庫的數(shù)據(jù)不一致的問題。如來解決翩剪?這里給出兩個(gè)解決方案乳怎,先易后難,結(jié)合業(yè)務(wù)和技術(shù)代價(jià)選擇使用

二、緩存和數(shù)據(jù)庫一致性解決方案

2.1方案一:采用延時(shí)雙刪策略

在寫庫前后都進(jìn)行redis.del(key)操作蚪缀,并且設(shè)定合理的超時(shí)時(shí)間秫逝。偽代碼如下

public void write( String key, Object data )
{
    redis.delKey( key );
    db.updateData( data );
    Thread.sleep( 500 );
    redis.delKey( key );
}

具體的步驟就是:

  • 先刪除緩存
  • 再寫數(shù)據(jù)庫
  • 休眠500毫秒
  • 再次刪除緩存
    那么,這個(gè)500毫秒怎么確定的询枚,具體該休眠多久呢违帆?需要評(píng)估自己的項(xiàng)目的讀數(shù)據(jù)業(yè)務(wù)邏輯的耗時(shí)。這么做的目的金蜀,就是確保讀請(qǐng)求(線程B)結(jié)束刷后,寫請(qǐng)求可以刪除讀請(qǐng)求造成的緩存臟數(shù)據(jù)。

設(shè)置緩存過期時(shí)間
從理論上來說渊抄,給緩存設(shè)置過期時(shí)間尝胆,是保證最終一致性的解決方案。所有的寫操作以數(shù)據(jù)庫為準(zhǔn)护桦,只要到達(dá)緩存過期時(shí)間含衔,則后面的讀請(qǐng)求自然會(huì)從數(shù)據(jù)庫中讀取新值然后回填緩存。

2.2 方案二:異步更新緩存(基于訂閱binlog的同步機(jī)制)

阿里巴巴的一款開源框架canal二庵,提供了一種發(fā)布/ 訂閱模式的同步機(jī)制贪染,通過該框架我們可以對(duì)MySQL的binlog進(jìn)行訂閱,這樣一旦MySQL中產(chǎn)生了新的寫入催享、更新杭隙、刪除等操作,就可以把binlog相關(guān)的消息推送至Redis因妙,Redis再根據(jù)binlog中的記錄寺渗,對(duì)Redis進(jìn)行更新。值得注意的是兰迫,binlog需要手動(dòng)打開信殊,并且不會(huì)記錄關(guān)于MySQL查詢的命令和操作。

其實(shí)這種機(jī)制汁果,很類似MySQL的主從備份機(jī)制涡拘,因?yàn)镸ySQL的主備也是通過binlog來實(shí)現(xiàn)的數(shù)據(jù)一致性。而canal正是模仿了slave數(shù)據(jù)庫的備份請(qǐng)求据德,使得Redis的數(shù)據(jù)更新達(dá)到了相同的效果鳄乏。

三、圖解

3.1 先刪緩存后更新庫
先刪緩存后更新庫
3.2 先更新庫再刪緩存
先更新庫再刪緩存
3.3 普通雙刪
普通雙刪
3.4 延時(shí)雙刪
延時(shí)雙刪

轉(zhuǎn)載自:Redis和mysql數(shù)據(jù)怎么保持?jǐn)?shù)據(jù)一致的棘利?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末橱野,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子善玫,更是在濱河造成了極大的恐慌水援,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蜗元,居然都是意外死亡或渤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門奕扣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來薪鹦,“玉大人,你說我怎么就攤上這事惯豆〕卮牛” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵楷兽,是天一觀的道長框仔。 經(jīng)常有香客問我,道長拄养,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任银舱,我火速辦了婚禮瘪匿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寻馏。我一直安慰自己棋弥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布诚欠。 她就那樣靜靜地躺著顽染,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轰绵。 梳的紋絲不亂的頭發(fā)上粉寞,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音左腔,去河邊找鬼唧垦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛液样,可吹牛的內(nèi)容都是我干的振亮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鞭莽,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼坊秸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起澎怒,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤褒搔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體站超,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荸恕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了死相。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片融求。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖算撮,靈堂內(nèi)的尸體忽然破棺而出生宛,到底是詐尸還是另有隱情,我是刑警寧澤肮柜,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布陷舅,位于F島的核電站,受9級(jí)特大地震影響审洞,放射性物質(zhì)發(fā)生泄漏莱睁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一芒澜、第九天 我趴在偏房一處隱蔽的房頂上張望仰剿。 院中可真熱鬧,春花似錦痴晦、人聲如沸南吮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽部凑。三九已至,卻和暖如春碧浊,著一層夾襖步出監(jiān)牢的瞬間涂邀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來泰國打工箱锐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留必孤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓瑞躺,卻偏偏與公主長得像敷搪,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子幢哨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355