91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

架構(gòu)師居然這么設(shè)計(jì)DB+緩存

jf_ro2CN3Fa ? 來源:樓仔 ? 作者:樓仔 ? 2022-10-10 16:24 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

來源:樓仔

不好的方案

1. 先寫 MySQL,再寫 Redis

2. 先寫 Redis,再寫 MySQL

3. 先刪除 Redis,再寫 MySQL

好的方案

5. 先寫 MySQL,再刪除 Redis

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

幾種方案比較

大家好,這個(gè)問題很早之前我就遇到過,但是一直沒有仔細(xì)去研究,上個(gè)月看了極客的課程,有一篇文章專門有過講解,所以感覺有必要單獨(dú)出一篇。

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

05019796-3750-11ed-ba43-dac502259ad0.png

不好的方案

1. 先寫 MySQL,再寫 Redis

0512eda2-3750-11ed-ba43-dac502259ad0.png

圖解說明:

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

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

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

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

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

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

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

2. 先寫 Redis,再寫 MySQL

052753dc-3750-11ed-ba43-dac502259ad0.png

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

3. 先刪除 Redis,再寫 MySQL

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

05385380-3750-11ed-ba43-dac502259ad0.png

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

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

好的方案

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

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

054369a0-3750-11ed-ba43-dac502259ad0.png

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

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

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

054eca98-3750-11ed-ba43-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

055dbc60-3750-11ed-ba43-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,會重新查一次 DB,然后再回寫到 Reids。

056a71da-3750-11ed-ba43-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è)前提,查詢的請求,不會回寫 Redis。

057bab30-3750-11ed-ba43-dac502259ad0.png

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

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

幾種方案比較

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

先寫 Redis,再寫 MySQL

這種方案,我肯定不會用 ,萬一 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ù)匯總等,建議會用這種方式 ,比如 binlog + kafka,數(shù)據(jù)的一致性也可以達(dá)到秒級;

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

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

實(shí)時(shí)一致性方案 :采用“先寫 MySQL,再刪除 Redis”的策略,這種情況雖然也會存在兩者不一致,但是需要滿足的條件有點(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)投訴
  • 架構(gòu)
    +關(guān)注

    關(guān)注

    1

    文章

    532

    瀏覽量

    26589
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    906

    瀏覽量

    29521
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    392

    瀏覽量

    12185
  • binlog
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    1412

原文標(biāo)題:從美團(tuán)挖來的架構(gòu)師居然這么設(shè)計(jì)DB+緩存,真的長見識了!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

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

    高通Oryon架構(gòu)之父宣布離職:曾一手定義移動(dòng)芯片黃金時(shí)代

    電子發(fā)燒友綜合報(bào)道 近日,全球半導(dǎo)體領(lǐng)域的傳奇架構(gòu)師、高通工程高級副總裁杰拉德·威廉姆斯三世(Gerard Williams III) 在領(lǐng)英上正式宣布辭去高通職務(wù),他表示將“開啟人生新篇章”,但未
    的頭像 發(fā)表于 02-05 13:44 ?2017次閱讀

    軟通動(dòng)力與居然之家深化戰(zhàn)略合作

    1月19日,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司與居然智家新零售集團(tuán)股份有限公司在北京居然大廈簽署戰(zhàn)略合作協(xié)議,共同宣告將雙方合作全面升級至“戰(zhàn)略合作2.0”新階段。雙方將整合各自優(yōu)勢資源,圍繞數(shù)智化轉(zhuǎn)型升級、全球化市場聯(lián)合拓展、生態(tài)空間建設(shè)等領(lǐng)域展開深度合作,共同推動(dòng)行
    的頭像 發(fā)表于 01-21 16:17 ?382次閱讀

    C語言的緩沖區(qū)(緩存)詳解

    緩沖區(qū)又稱為緩存,它是內(nèi)存空間的一部分。也就是說,在內(nèi)存空間中預(yù)留了一定的存儲空間,這些存儲空間用來緩沖輸入或輸出的數(shù)據(jù),這部分預(yù)留的空間就叫做緩沖區(qū)。   緩沖區(qū)根據(jù)其對應(yīng)的是輸入設(shè)備還是輸出設(shè)備
    發(fā)表于 01-14 07:30

    串口DMA發(fā)送有緩存嗎?

    串口DMA發(fā)送有緩存嗎, 我是從ringbuffer取出來,放到申請的緩存里,啟動(dòng)串口DMA發(fā)送,然后就釋放了。暫時(shí)沒發(fā)現(xiàn)什么問題。 用的drv_usart.c是這個(gè)版本
    發(fā)表于 10-10 06:14

    在TR組件優(yōu)化與存算一體架構(gòu)中構(gòu)建技術(shù)話語權(quán)

    需要掌握HBM2e接口協(xié)議 類腦計(jì)算要求理解脈沖神經(jīng)網(wǎng)絡(luò)(SNN) 光子計(jì)算涉及硅基光電子集成技術(shù) 參與某國家級AI芯片項(xiàng)目的團(tuán)隊(duì)透露,核心研發(fā)人員均具備\"處理器架構(gòu)師\"
    發(fā)表于 08-26 10:40

    緩存之美:萬文詳解 Caffeine 實(shí)現(xiàn)原理(上)

    文章將采用“總-分-總”的結(jié)構(gòu)對配置固定大小元素驅(qū)逐策略的 Caffeine 緩存進(jìn)行介紹,首先會講解它的實(shí)現(xiàn)原理,在大家對它有一個(gè)概念之后再深入具體源碼的細(xì)節(jié)之中,理解它的設(shè)計(jì)理念,從中能學(xué)習(xí)到
    的頭像 發(fā)表于 08-05 14:49 ?702次閱讀
    <b class='flag-5'>緩存</b>之美:萬文詳解 Caffeine 實(shí)現(xiàn)原理(上)

    Tenstorrent 首席架構(gòu)師:未來 RISC-V 會是計(jì)算機(jī)的主流

    強(qiáng),適合定制化需求等。在 7 月 17 日第五屆(2025)RISC-V 中國峰會的主論壇上,Tenstorrent 首席架構(gòu)師 Wei-Han Lien 表示,Tenstorrent 投入了大量人力
    發(fā)表于 07-17 11:26 ?1484次閱讀

    harmony-utils之CacheUtil,緩存工具類

    harmony-utils之CacheUtil,緩存工具類
    的頭像 發(fā)表于 07-04 16:36 ?495次閱讀

    高性能緩存設(shè)計(jì):如何解決緩存偽共享問題

    在多核高并發(fā)場景下, 緩存偽共享(False Sharing) 是導(dǎo)致性能驟降的“隱形殺手”。當(dāng)不同線程頻繁修改同一緩存行(Cache Line)中的獨(dú)立變量時(shí),CPU緩存一致性協(xié)議會強(qiáng)制同步整個(gè)
    的頭像 發(fā)表于 07-01 15:01 ?762次閱讀
    高性能<b class='flag-5'>緩存</b>設(shè)計(jì):如何解決<b class='flag-5'>緩存</b>偽共享問題

    如何釋放異構(gòu)計(jì)算的潛能?Imagination與Baya Systems的系統(tǒng)架構(gòu)實(shí)踐啟示

    報(bào)告作者:PallaviSharma,Imaginaiton產(chǎn)品管理總監(jiān)Dr.EricNorige,BayaSystems首席軟件架構(gòu)師關(guān)注Imagination公眾號,消息框發(fā)送【異構(gòu)計(jì)算】,即可
    的頭像 發(fā)表于 06-13 08:33 ?1138次閱讀
    如何釋放異構(gòu)計(jì)算的潛能?Imagination與Baya Systems的系統(tǒng)<b class='flag-5'>架構(gòu)</b>實(shí)踐啟示

    MCU緩存設(shè)計(jì)

    MCU 設(shè)計(jì)通過優(yōu)化指令與數(shù)據(jù)的訪問效率,顯著提升系統(tǒng)性能并降低功耗,其核心架構(gòu)與實(shí)現(xiàn)策略如下: 一、緩存類型與結(jié)構(gòu) 指令緩存(I-Cache)與數(shù)據(jù)緩存(D-Cache)? I-Ca
    的頭像 發(fā)表于 05-07 15:29 ?1111次閱讀

    Nginx緩存配置詳解

    Nginx 是一個(gè)功能強(qiáng)大的 Web 服務(wù)器和反向代理服務(wù)器,它可以用于實(shí)現(xiàn)靜態(tài)內(nèi)容的緩存緩存可以分為客戶端緩存和服務(wù)端緩存。
    的頭像 發(fā)表于 05-07 14:03 ?1247次閱讀
    Nginx<b class='flag-5'>緩存</b>配置詳解

    帶你參觀一下射頻工程的試驗(yàn)臺

    臺也是一個(gè)必備好像是keysight的儀器底噪怎么這么高?一個(gè)標(biāo)準(zhǔn)的測試站竟然需要這么多儀器居然還有格子?我好想要這個(gè)mini小暗室這是不是像極了你的實(shí)驗(yàn)桌?有沒
    的頭像 發(fā)表于 04-30 18:34 ?486次閱讀
    帶你參觀一下射頻工程<b class='flag-5'>師</b>的試驗(yàn)臺

    AD8367 500 MHz 、45dB線性dB可變增益放大器技術(shù)手冊

    AD8367是一款高性能可變增益放大器,設(shè)計(jì)用于在最高500 MHz的中頻頻率下工作。從外部施加0至1 V的模擬增益控制電壓,可調(diào)整45 dB增益控制范圍,以提供20 mV/dB輸出。精確的線性dB
    的頭像 發(fā)表于 04-22 09:52 ?1782次閱讀
    AD8367 500 MHz 、45<b class='flag-5'>dB</b>線性<b class='flag-5'>dB</b>可變增益放大器技術(shù)手冊

    nginx中強(qiáng)緩存和協(xié)商緩存介紹

    強(qiáng)緩存直接告訴瀏覽器:在緩存過期前,無需與服務(wù)器通信,直接使用本地緩存。
    的頭像 發(fā)表于 04-01 16:01 ?986次閱讀