Redis 和 Mysql 數(shù)據(jù)庫數(shù)據(jù)如何保持一致性

????????在高并發(fā)的業(yè)務(wù)場景下较性,數(shù)據(jù)庫大多數(shù)情況都是用戶并發(fā)訪問最薄弱的環(huán)節(jié)。所以壶栋,就需要使用redis做一個(gè)緩沖操作辰如,讓請求先訪問到redis,而不是直接訪問Mysql等數(shù)據(jù)庫贵试。這樣可以大大緩解數(shù)據(jù)庫的壓力琉兜。具體業(yè)務(wù)流程如下:

? ? ? ? 讀取緩存步驟一般沒有什么問題凯正,但是一旦涉及到數(shù)據(jù)更新:數(shù)據(jù)庫和緩存更新,就容易出現(xiàn)緩存和數(shù)據(jù)庫間的數(shù)據(jù)一致性問題豌蟋。不管是先寫數(shù)據(jù)庫廊散,再刪除緩存;還是先刪除緩存梧疲,再寫庫允睹,都有可能出現(xiàn)數(shù)據(jù)不一致的情況。舉個(gè)例子:

????????1.如果刪除了緩存Redis幌氮,還沒有來得及寫庫MySQL缭受,另一個(gè)線程就來讀取,發(fā)現(xiàn)緩存為空该互,則去數(shù)據(jù)庫中讀取數(shù)據(jù)寫入緩存米者,此時(shí)緩存中為臟數(shù)據(jù)。

????????2.如果先寫了庫宇智,在刪除緩存前蔓搞,寫庫的線程宕機(jī)了,沒有刪除掉緩存普筹,則也會出現(xiàn)數(shù)據(jù)不一致情況败明。

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

一、?延時(shí)雙刪策略

? ??????在寫庫前后都進(jìn)行redis.del(key)操作酿愧,并且設(shè)定合理的超時(shí)時(shí)間沥潭。具體步驟是:

? ??????1)先刪除緩存

????????2)再寫數(shù)據(jù)庫

????????3)休眠500毫秒(根據(jù)具體的業(yè)務(wù)時(shí)間來定)

????????4)再次刪除緩存。

? ??????那么嬉挡,這個(gè)500毫秒怎么確定的钝鸽,具體該休眠多久呢?

? ? ? ? 需要評估自己的項(xiàng)目的讀數(shù)據(jù)業(yè)務(wù)邏輯的耗時(shí)庞钢。這么做的目的拔恰,就是確保讀請求結(jié)束,寫請求可以刪除讀請求造成的緩存臟數(shù)據(jù)基括。

? ? ? ? 當(dāng)然颜懊,這種策略還要考慮 redis 和數(shù)據(jù)庫主從同步的耗時(shí)。最后的寫數(shù)據(jù)的休眠時(shí)間:則在讀數(shù)據(jù)業(yè)務(wù)邏輯的耗時(shí)的基礎(chǔ)上,加上幾百ms即可河爹。比如:休眠1秒匠璧。

二、設(shè)置緩存的過期時(shí)間

? ??????從理論上來說咸这,給緩存設(shè)置過期時(shí)間夷恍,是保證最終一致性的解決方案。所有的寫操作以數(shù)據(jù)庫為準(zhǔn)炊苫,只要到達(dá)緩存過期時(shí)間裁厅,則后面的讀請求自然會從數(shù)據(jù)庫中讀取新值然后回填緩存

? ??????結(jié)合雙刪策略+緩存超時(shí)設(shè)置,這樣最差的情況就是在超時(shí)時(shí)間內(nèi)數(shù)據(jù)存在不一致侨艾,而且又增加了寫請求的耗時(shí)。

三拓挥、如何寫完數(shù)據(jù)庫后唠梨,再次刪除緩存成功?

? ? ? ? 上述的方案有一個(gè)缺點(diǎn)侥啤,那就是操作完數(shù)據(jù)庫后当叭,由于種種原因刪除緩存失敗,這時(shí)盖灸,可能就會出現(xiàn)數(shù)據(jù)不一致的情況蚁鳖。這里,我們需要提供一個(gè)保障重試的方案赁炎。

1醉箕、方案一具體流程

????????(1)更新數(shù)據(jù)庫數(shù)據(jù);?

????????(2)緩存因?yàn)榉N種問題刪除失斸愕妗讥裤;

????????(3)將需要刪除的key發(fā)送至消息隊(duì)列;

????????(4)自己消費(fèi)消息姻报,獲得需要刪除的key己英;

????????(5)繼續(xù)重試刪除操作,直到成功吴旋。

? ??????然而损肛,該方案有一個(gè)缺點(diǎn),對業(yè)務(wù)線代碼造成大量的侵入荣瑟。于是有了方案二治拿,在方案二中,啟動一個(gè)訂閱程序去訂閱數(shù)據(jù)庫的binlog褂傀,獲得需要操作的數(shù)據(jù)忍啤。在應(yīng)用程序中,另起一段程序,獲得這個(gè)訂閱程序傳來的信息同波,進(jìn)行刪除緩存操作鳄梅。?

2、方案二具體流程

????????(1)更新數(shù)據(jù)庫數(shù)據(jù)未檩;

????????(2)數(shù)據(jù)庫會將操作信息寫入binlog日志當(dāng)中戴尸;

????????(3)訂閱程序提取出所需要的數(shù)據(jù)以及key;?

????????(4)另起一段非業(yè)務(wù)代碼冤狡,獲得該信息孙蒙;

????????(5)嘗試刪除緩存操作,發(fā)現(xiàn)刪除失敱ā挎峦;?

????????(6)將這些信息發(fā)送至消息隊(duì)列;

????????(7)重新從消息隊(duì)列中獲得該數(shù)據(jù)合瓢,重試操作坦胶。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市晴楔,隨后出現(xiàn)的幾起案子顿苇,更是在濱河造成了極大的恐慌,老刑警劉巖税弃,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纪岁,死亡現(xiàn)場離奇詭異,居然都是意外死亡则果,警方通過查閱死者的電腦和手機(jī)幔翰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來短条,“玉大人导匣,你說我怎么就攤上這事∪资保” “怎么了贡定?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長可都。 經(jīng)常有香客問我缓待,道長,這世上最難降的妖魔是什么渠牲? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任旋炒,我火速辦了婚禮,結(jié)果婚禮上签杈,老公的妹妹穿的比我還像新娘瘫镇。我一直安慰自己鼎兽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布铣除。 她就那樣靜靜地躺著谚咬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尚粘。 梳的紋絲不亂的頭發(fā)上择卦,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機(jī)與錄音郎嫁,去河邊找鬼秉继。 笑死,一個(gè)胖子當(dāng)著我的面吹牛泽铛,可吹牛的內(nèi)容都是我干的尚辑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼厚宰,長吁一口氣:“原來是場噩夢啊……” “哼腌巾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起铲觉,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吓坚,沒想到半個(gè)月后撵幽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡礁击,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年盐杂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哆窿。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡链烈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挚躯,到底是詐尸還是另有隱情强衡,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布码荔,位于F島的核電站漩勤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏缩搅。R本人自食惡果不足惜越败,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望硼瓣。 院中可真熱鬧究飞,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至袱蜡,卻和暖如春丝蹭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坪蚁。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工奔穿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人敏晤。 一個(gè)月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓贱田,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嘴脾。 傳聞我的和親對象是個(gè)殘疾皇子男摧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

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