在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何保障MySQL和Redis的數(shù)據(jù)一致性

Linux愛好者 ? 來源:Linux愛好者 ? 2023-03-14 16:48 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

我直接先拋一下結(jié)論:在滿足實(shí)時(shí)性的條件下,不存在兩者完全保存一致的方案,只有最終一致性方案。根據(jù)網(wǎng)上的眾多解決方案,總結(jié)出 6 種,直接看目錄:

a0f40be6-c23a-11ed-bfe3-dac502259ad0.png

不好的方案

1. 先寫 MySQL,再寫 Redis

a114271e-c23a-11ed-bfe3-dac502259ad0.png

圖解說明:

這是一副時(shí)序圖,描述請求的先后調(diào)用順序;

橘黃色的線是請求 A,黑色的線是請求 B;

橘黃色的文字,是 MySQL 和 Redis 最終不一致的數(shù)據(jù);

數(shù)據(jù)是從 10 更新為 11;

后面所有的圖,都是這個(gè)含義,不再贅述。

請求 A、B 都是先寫 MySQL,然后再寫 Redis,在高并發(fā)情況下,如果請求 A 在寫 Redis 時(shí)卡了一會(huì),請求 B 已經(jīng)依次完成數(shù)據(jù)的更新,就會(huì)出現(xiàn)圖中的問題。

這個(gè)圖已經(jīng)畫的很清晰了,我就不用再去啰嗦了吧,不過這里有個(gè)前提,就是對于讀請求,先去讀 Redis,如果沒有,再去讀 DB,但是讀請求不會(huì)再回寫 Redis。大白話說一下,就是讀請求不會(huì)更新 Redis。

2. 先寫 Redis,再寫 MySQL

a12d47a8-c23a-11ed-bfe3-dac502259ad0.png

同“先寫 MySQL,再寫 Redis”,看圖可秒懂。

3. 先刪除 Redis,再寫 MySQL

這幅圖和上面有些不一樣,前面的請求 A 和 B 都是更新請求,這里的請求 A 是更新請求,但是請求 B 是讀請求,且請求 B 的讀請求會(huì)回寫 Redis。

a13a6500-c23a-11ed-bfe3-dac502259ad0.png

請求 A 先刪除緩存,可能因?yàn)榭D,數(shù)據(jù)一直沒有更新到 MySQL,導(dǎo)致兩者數(shù)據(jù)不一致。

這種情況出現(xiàn)的概率比較大,因?yàn)檎埱?A 更新 MySQL 可能耗時(shí)會(huì)比較長,而請求 B 的前兩步都是查詢,會(huì)非常快。

好的方案

4. 先刪除 Redis,再寫 MySQL,再刪除 Redis

對于“先刪除 Redis,再寫 MySQL”,如果要解決最后的不一致問題,其實(shí)再對 Redis 重新刪除即可,這個(gè)也是大家常說的“緩存雙刪”。

a1534084-c23a-11ed-bfe3-dac502259ad0.png

為了便于大家看圖,對于藍(lán)色的文字,“刪除緩存 10”必須在“回寫緩存10”后面,那如何才能保證一定是在后面呢?網(wǎng)上給出的第一個(gè)方案是,讓請求 A 的最后一次刪除,等待 500ms。

對于這種方案,看看就行,反正我是不會(huì)用,太 Low 了,風(fēng)險(xiǎn)也不可控。

那有沒有更好的方案呢,我建議異步串行化刪除,即刪除請求入隊(duì)列

a1737ae8-c23a-11ed-bfe3-dac502259ad0.png

異步刪除對線上業(yè)務(wù)無影響,串行化處理保障并發(fā)情況下正確刪除。

如果雙刪失敗怎么辦,網(wǎng)上有給 Redis 加一個(gè)緩存過期時(shí)間的方案,這個(gè)不敢茍同。個(gè)人建議整個(gè)重試機(jī)制,可以借助消息隊(duì)列的重試機(jī)制,也可以自己整個(gè)表,記錄重試次數(shù),方法很多。

簡單小結(jié)一下:

“緩存雙刪”不要用無腦的 sleep 500 ms;

通過消息隊(duì)列的異步&串行,實(shí)現(xiàn)最后一次緩存刪除;

緩存刪除失敗,增加重試機(jī)制。

5. 先寫 MySQL,再刪除 Redis

a17d1878-c23a-11ed-bfe3-dac502259ad0.png

對于上面這種情況,對于第一次查詢,請求 B 查詢的數(shù)據(jù)是 10,但是 MySQL 的數(shù)據(jù)是 11,只存在這一次不一致的情況,對于不是強(qiáng)一致性要求的業(yè)務(wù),可以容忍。(那什么情況下不能容忍呢,比如秒殺業(yè)務(wù)、庫存服務(wù)等。)

當(dāng)請求 B 進(jìn)行第二次查詢時(shí),因?yàn)闆]有命中 Redis,會(huì)重新查一次 DB,然后再回寫到 Reids。

a1aec828-c23a-11ed-bfe3-dac502259ad0.png

這里需要滿足 2 個(gè)條件:

緩存剛好自動(dòng)失效;

請求 B 從數(shù)據(jù)庫查出 10,回寫緩存的耗時(shí),比請求 A 寫數(shù)據(jù)庫,并且刪除緩存的還長。

對于第二個(gè)條件,我們都知道更新 DB 肯定比查詢耗時(shí)要長,所以出現(xiàn)這個(gè)情況的概率很小,同時(shí)滿足上述條件的情況更小。

6. 先寫 MySQL,通過 Binlog,異步更新 Redis

這種方案,主要是監(jiān)聽 MySQL 的 Binlog,然后通過異步的方式,將數(shù)據(jù)更新到 Redis,這種方案有個(gè)前提,查詢的請求,不會(huì)回寫 Redis。

a1d5bc94-c23a-11ed-bfe3-dac502259ad0.png

這個(gè)方案,會(huì)保證 MySQL 和 Redis 的最終一致性,但是如果中途請求 B 需要查詢數(shù)據(jù),如果緩存無數(shù)據(jù),就直接查 DB;如果緩存有數(shù)據(jù),查詢的數(shù)據(jù)也會(huì)存在不一致的情況。

所以這個(gè)方案,是實(shí)現(xiàn)最終一致性的終極解決方案,但是不能保證實(shí)時(shí)性。

幾種方案比較

我們對比上面討論的 6 種方案:

先寫 Redis,再寫 MySQL

這種方案,我肯定不會(huì)用,萬一 DB 掛了,你把數(shù)據(jù)寫到緩存,DB 無數(shù)據(jù),這個(gè)是災(zāi)難性的;

我之前也見同學(xué)這么用過,如果寫 DB 失敗,對 Redis 進(jìn)行逆操作,那如果逆操作失敗呢,是不是還要搞個(gè)重試?

先寫 MySQL,再寫 Redis

對于并發(fā)量、一致性要求不高的項(xiàng)目,很多就是這么用的,我之前也經(jīng)常這么搞,但是不建議這么做;

當(dāng) Redis 瞬間不可用的情況,需要報(bào)警出來,然后線下處理。

先刪除 Redis,再寫 MySQL

這種方式,我還真沒用過,直接忽略吧。

先刪除 Redis,再寫 MySQL,再刪除 Redis

這種方式雖然可行,但是感覺好復(fù)雜,還要搞個(gè)消息隊(duì)列去異步刪除 Redis。

先寫 MySQL,再刪除 Redis

比較推薦這種方式,刪除 Redis 如果失敗,可以再多重試幾次,否則報(bào)警出來;

這個(gè)方案,是實(shí)時(shí)性中最好的方案,在一些高并發(fā)場景中,推薦這種。

先寫 MySQL,通過 Binlog,異步更新 Redis

對于異地容災(zāi)、數(shù)據(jù)匯總等,建議會(huì)用這種方式,比如 binlog + kafka,數(shù)據(jù)的一致性也可以達(dá)到秒級;

純粹的高并發(fā)場景,不建議用這種方案,比如搶購、秒殺等。

個(gè)人結(jié)論:

實(shí)時(shí)一致性方案:采用“先寫 MySQL,再刪除 Redis”的策略,這種情況雖然也會(huì)存在兩者不一致,但是需要滿足的條件有點(diǎn)苛刻,所以是滿足實(shí)時(shí)性條件下,能盡量滿足一致性的最優(yōu)解。

最終一致性方案:采用“先寫 MySQL,通過 Binlog,異步更新 Redis”,可以通過 Binlog,結(jié)合消息隊(duì)列異步更新 Redis,是最終一致性的最優(yōu)解。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7250

    瀏覽量

    91515
  • 緩存
    +關(guān)注

    關(guān)注

    1

    文章

    245

    瀏覽量

    27101
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    850

    瀏覽量

    27730
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    385

    瀏覽量

    11380

原文標(biāo)題:幾種方案比較

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    串行數(shù)據(jù)一致性測試和驗(yàn)證測量基礎(chǔ)知識

    小弟這次給大家?guī)砹舜?b class='flag-5'>數(shù)據(jù)一致性測試和驗(yàn)證測量基礎(chǔ)知識其中提到了些高速串行信號的測試測量方法和簡單的原理性介紹,適合初學(xué)者使用。PS。這其中提到的些測量設(shè)備現(xiàn)在已經(jīng)升級為最新的儀器設(shè)備,但是測試的原理和技術(shù)還是可以讓大家閑
    發(fā)表于 04-16 16:17

    Redis緩存和MySQL數(shù)據(jù)一致原因和解決方案

    高并發(fā)架構(gòu)系列:Redis緩存和MySQL數(shù)據(jù)一致性方案詳解
    發(fā)表于 03-27 15:55

    一致性非鎖定讀分析

    MySQL探秘(六)InnoDB一致性非鎖定讀
    發(fā)表于 09-17 08:39

    如何解決stm32 H7 DMA串口發(fā)送數(shù)據(jù)一致性問題?

    如何解決stm32 H7 DMA串口發(fā)送數(shù)據(jù)一致性問題?
    發(fā)表于 12-06 06:05

    VxWorks中主備數(shù)據(jù)一致性功能組件的設(shè)計(jì)與實(shí)現(xiàn)

    數(shù)據(jù)一致性是主備用系統(tǒng)必須解決的問題。目前主備系統(tǒng)的一致性都采用手工編程來實(shí)現(xiàn)。導(dǎo)致代碼結(jié)構(gòu)繁雜,且效率不高。利用VxWorks的異常處理機(jī)制,結(jié)合RISC CPU的特性.設(shè)
    發(fā)表于 12-16 14:21 ?5次下載

    VxWorks中主備數(shù)據(jù)一致性功能組件的設(shè)計(jì)與實(shí)現(xiàn)

    數(shù)據(jù)一致性是主備用系統(tǒng)必須解決的問題。目前主備系統(tǒng)的一致性都采用手工編程來實(shí)現(xiàn),導(dǎo)致代碼結(jié)構(gòu)繁雜,且效率不高。利用VxWorks 的異常處理機(jī)制,結(jié)合RISC CPU 的特性,設(shè)計(jì)實(shí)
    發(fā)表于 09-22 11:32 ?8次下載

    VxWorks中主備數(shù)據(jù)一致性功能組件的設(shè)計(jì)與實(shí)現(xiàn)

    數(shù)據(jù)一致性是主備用系統(tǒng)必須解決的問題。目前主備系統(tǒng)的一致性都采用手工編程來實(shí)現(xiàn)。導(dǎo)致代碼結(jié)構(gòu)繁雜,且效率不高。利用VxWorks的異常處理機(jī)制,結(jié)合RISC CPU的特性.設(shè)計(jì)
    發(fā)表于 11-28 16:47 ?11次下載

    P2P平臺(tái)上的數(shù)據(jù)一致性研究

    P2P網(wǎng)絡(luò)是個(gè)自組織的動(dòng)態(tài)網(wǎng)絡(luò),對等點(diǎn)可以隨意的加入或者離開網(wǎng)絡(luò),因此如何控制數(shù)據(jù)一致性成了P2P網(wǎng)絡(luò)平臺(tái)應(yīng)用擴(kuò)展應(yīng)用的關(guān)鍵點(diǎn),本文引入數(shù)據(jù)一致性算法到P2P網(wǎng)絡(luò)平臺(tái)中來,
    發(fā)表于 02-25 16:06 ?15次下載

    串行數(shù)據(jù)一致性及驗(yàn)證基礎(chǔ)指南

    本基礎(chǔ)指南旨在幫助您了解串行數(shù)據(jù)傳輸?shù)?b class='flag-5'>一般方面,并介紹適用于這些新興串行技術(shù)的模擬和數(shù)字測量要求。 串行數(shù)據(jù)一致性測試和驗(yàn)證測量基礎(chǔ)知識本手冊將幫助您理解串行
    發(fā)表于 08-05 15:14 ?32次下載

    電能質(zhì)量監(jiān)測數(shù)據(jù)一致性定義及檢測方法_邱麗羚

    電能質(zhì)量監(jiān)測數(shù)據(jù)一致性定義及檢測方法_邱麗羚
    發(fā)表于 01-08 11:07 ?0次下載

    分布式系統(tǒng)的CAP和數(shù)據(jù)一致性模型

    CAP理論的核心思想是任何基于網(wǎng)絡(luò)的數(shù)據(jù)共享系統(tǒng)最多只能滿足數(shù)據(jù)一致性(Consistency)、可用(Availability)和網(wǎng)絡(luò)分區(qū)容忍(Partition Tolerance)三個(gè)特性中的兩個(gè)。
    的頭像 發(fā)表于 05-05 23:20 ?2518次閱讀

    redismysql如何保持數(shù)據(jù)一致性

    RedisMySQL是兩個(gè)常用的數(shù)據(jù)庫系統(tǒng),它們都有自己的特點(diǎn)和用途。在某些場景下,我們可能需要將RedisMySQL進(jìn)行結(jié)合使用,并保
    的頭像 發(fā)表于 11-16 11:27 ?1169次閱讀

    Redis緩存與Mysql如何保證一致性

    基本流程就是客戶端A請求,先去刪除緩存,然后將數(shù)據(jù)寫入數(shù)據(jù)庫,此時(shí)客戶端B查詢先去查詢緩存,緩存沒有返回,去查數(shù)據(jù)庫,此時(shí)還沒有完成主從同步,拿到是從庫的舊數(shù)據(jù),然后將舊
    的頭像 發(fā)表于 12-02 14:23 ?1286次閱讀
    <b class='flag-5'>Redis</b>緩存與<b class='flag-5'>Mysql</b>如何保證<b class='flag-5'>一致性</b>?

    redis集群中的hash一致性算法的理解

    Redis集群是種為了增強(qiáng)Redis的可擴(kuò)展性和高可用而設(shè)計(jì)的集群方案。在Redis集群中,一致性
    的頭像 發(fā)表于 12-04 10:45 ?1016次閱讀

    深入理解數(shù)據(jù)備份的關(guān)鍵原則:應(yīng)用一致性與崩潰一致性的區(qū)別

    深入理解數(shù)據(jù)備份的關(guān)鍵原則:應(yīng)用一致性與崩潰一致性的區(qū)別 在數(shù)字化時(shí)代,數(shù)據(jù)備份成為了企業(yè)信息安全的核心環(huán)節(jié)。但在備份過程中,兩個(gè)關(guān)鍵概念——應(yīng)用
    的頭像 發(fā)表于 03-11 11:29 ?1369次閱讀
    深入理解<b class='flag-5'>數(shù)據(jù)</b>備份的關(guān)鍵原則:應(yīng)用<b class='flag-5'>一致性</b>與崩潰<b class='flag-5'>一致性</b>的區(qū)別
    主站蜘蛛池模板: 国产吧在线 | 国产美女主播一级成人毛片 | 国产一级特黄aa大片爽爽 | 天天操天天干天天透 | 色天使久久综合网天天 | 国产又黄又免费aaaa视频 | 80s国产成年女人毛片 | 在线精品视频成人网 | 亚洲最新视频 | 精品国产麻豆免费人成网站 | 天天射夜夜操 | 香港午夜理理伦_级毛片 | 国产一二三区在线观看 | 欧美一区二区影院 | 日本美女黄色一级片 | 黄色在线观看网址 | 亚洲情欲网 | 免费视频黄 | 最新看片网址 | 高清视频免费观看 | 久久9966精品国产免费 | 欧美在线三级 | 天堂资源最新版在线官网 | 精品卡1卡2卡三卡免费视频 | 天天做天天爱夜夜想毛片 | 亚洲国产精品综合久久2007 | 美女视频永久黄网站在线观看 | 婷婷综合亚洲 | 任你操免费视频 | 被公侵犯肉体中文字幕一区二区 | 中文字幕有码在线视频 | 激情五月宗合网 | 午夜免费r级伦理片 | 国产色婷婷精品综合在线手机播放 | 天天干夜干 | 高级毛片 | 免费h网站在线观看 | 4438x成人网全国最大 | 97se狠狠狠狠狼亚洲综合网 | 一级毛片在播放免费 | 天堂网在线www资源网 |