<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試官:Redis和Mysql如何保證數(shù)據(jù)一致性?

          共 2247字,需瀏覽 5分鐘

           ·

          2023-03-04 00:13

          點(diǎn)擊關(guān)注公眾號(hào):互聯(lián)網(wǎng)架構(gòu)師,后臺(tái)回復(fù) 2T獲取2TB學(xué)習(xí)資源!

          上一篇:Alibaba開源內(nèi)網(wǎng)高并發(fā)編程手冊(cè).pdf

          前言

          先闡明一下Mysql和Redis的關(guān)系:Mysql是數(shù)據(jù)庫(kù),用來(lái)持久化數(shù)據(jù),一定程度上保證數(shù)據(jù)的可靠性;Redis是用來(lái)當(dāng)緩存,用來(lái)提升數(shù)據(jù)訪問(wèn)的性能。
          關(guān)于如何保證Mysql和Redis中的數(shù)據(jù)一致(即緩存一致性問(wèn)題),這是一個(gè)非常經(jīng)典的問(wèn)題。
          使用過(guò)緩存的人都應(yīng)該知道,在實(shí)際應(yīng)用場(chǎng)景中,要想實(shí)時(shí)刻保證緩存和數(shù)據(jù)庫(kù)中的數(shù)據(jù)一樣,很難做到。
          基本上都是盡可能讓他們的數(shù)據(jù)在絕大部分時(shí)間內(nèi)保持一致,并保證最終是一致的。


          1.緩存不一致是如何產(chǎn)生的

          如果數(shù)據(jù)一直沒(méi)有變更,那么就不會(huì)出現(xiàn)緩存不一致的問(wèn)題。

          通常緩存不一致是發(fā)生在數(shù)據(jù)有變更的時(shí)候。因?yàn)槊看螖?shù)據(jù)變更你需要同時(shí)操作數(shù)據(jù)庫(kù)和緩存,而他們又屬于不同的系統(tǒng),無(wú)法做到同時(shí)操作成功或失敗,總會(huì)有一個(gè)時(shí)間差。在并發(fā)讀寫的時(shí)候可能就會(huì)出現(xiàn)緩存不一致的問(wèn)題(理論上通過(guò)分布式事務(wù)可以保證這一點(diǎn),不過(guò)實(shí)際上基本上很少有人這么做)。

          雖然沒(méi)辦法在數(shù)據(jù)有變更時(shí),保證緩存和數(shù)據(jù)庫(kù)強(qiáng)一致,但對(duì)緩存的更新還是有一定設(shè)計(jì)方法的,遵循這些設(shè)計(jì)方法,能夠讓這個(gè)不一致的影響時(shí)間和影響范圍最小化。


          2.緩存更新的幾種設(shè)計(jì)

          緩存更新的設(shè)計(jì)方法大概有以下四種:

          • 先刪除緩存,再更新數(shù)據(jù)庫(kù)(這種方法在并發(fā)下最容易出現(xiàn)長(zhǎng)時(shí)間的臟數(shù)據(jù),不可?。?/span>

          • 先更新數(shù)據(jù)庫(kù),刪除緩存(Cache Aside Pattern)

          • 只更新緩存,由緩存自己同步更新數(shù)據(jù)庫(kù)(Read/Write Through Pattern)

          • 只更新緩存,由緩存自己異步更新數(shù)據(jù)庫(kù)(Write Behind Cache Pattern)

          接下來(lái)詳細(xì)介紹一些這四種設(shè)計(jì)方法


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

          這種方法在并發(fā)讀寫的情況下容易出現(xiàn)緩存不一致的問(wèn)題

           

          如上圖所示,其可能的執(zhí)行流程順序?yàn)椋?/span>

          • 客戶端1 觸發(fā)更新數(shù)據(jù)A的邏輯

          • 客戶端2 觸發(fā)查詢數(shù)據(jù)A的邏輯

          • 客戶端1 刪除緩存中數(shù)據(jù)A

          • 客戶端2 查詢緩存中數(shù)據(jù)A,未命中

          • 客戶端2 從數(shù)據(jù)庫(kù)查詢數(shù)據(jù)A,并更新到緩存中

          • 客戶端1 更新數(shù)據(jù)庫(kù)中數(shù)據(jù)A

          可見(jiàn),最后緩存中的數(shù)據(jù)A跟數(shù)據(jù)庫(kù)中的數(shù)據(jù)A是不一致的,緩存中的數(shù)據(jù)A是舊的臟數(shù)據(jù)。

          因此一般不建議使用這種方式。


          2.2 先更新數(shù)據(jù)庫(kù),再讓緩存失效

          這種方法在并發(fā)讀寫的情況下,也可能會(huì)出現(xiàn)短暫緩存不一致的問(wèn)題

           

          如上圖所示,其可能執(zhí)行的流程順序?yàn)椋?/span>

          • 客戶端1 觸發(fā)更新數(shù)據(jù)A的邏輯

          • 客戶端2 觸發(fā)查詢數(shù)據(jù)A的邏輯

          • 客戶端3 觸發(fā)查詢數(shù)據(jù)A的邏輯

          • 客戶端1 更新數(shù)據(jù)庫(kù)中數(shù)據(jù)A

          • 客戶端2 查詢緩存中數(shù)據(jù)A,命中返回(舊數(shù)據(jù))

          • 客戶端1 讓緩存中數(shù)據(jù)A失效

          • 客戶端3 查詢緩存中數(shù)據(jù)A,未命中

          • 客戶端3 查詢數(shù)據(jù)庫(kù)中數(shù)據(jù)A,并更新到緩存中

          可見(jiàn),最后緩存中的數(shù)據(jù)A和數(shù)據(jù)庫(kù)中的數(shù)據(jù)A是一致的,理論上可能會(huì)出現(xiàn)一小段時(shí)間數(shù)據(jù)不一致,不過(guò)這種概率也比較低,大部分的業(yè)務(wù)也不會(huì)有太大的問(wèn)題。


          2.3 只更新緩存,由緩存自己同步更新數(shù)據(jù)庫(kù)(Read/Write Through Pattern)

          這種方法相當(dāng)于是業(yè)務(wù)只更新緩存,再由緩存去同步更新數(shù)據(jù)庫(kù)。一個(gè)Write Through的 例子如下:

           

          如上圖所示,其可能執(zhí)行的流程順序?yàn)椋?/span>
          • 客戶端1 觸發(fā)更新數(shù)據(jù)A的邏輯
          • 客戶端2 觸發(fā)查詢數(shù)據(jù)A的邏輯
          • 客戶端1 更新緩存中數(shù)據(jù)A,緩存同步更新數(shù)據(jù)庫(kù)中數(shù)據(jù)A,再返回結(jié)果
          • 客戶端2 查詢緩存中數(shù)據(jù)A,命中返回
          Read Through 和 WriteThrough 的流程類似,只是在客戶端查詢數(shù)據(jù)A時(shí),如果緩存中數(shù)據(jù)A失效了(過(guò)期或被驅(qū)逐淘汰),則緩存會(huì)同步去數(shù)據(jù)庫(kù)中查詢數(shù)據(jù)A,并緩存起來(lái),再返回給客戶端
          這種方式緩存不一致的概率極低,只不過(guò)需要對(duì)緩存進(jìn)行專門的改造。

          2.4 只更新緩存,由緩存自己異步更新數(shù)據(jù)庫(kù)(Write Behind Cache Pattern)
          這種方式性詳單于是業(yè)務(wù)只操作更新緩存,再由緩存異步去更新數(shù)據(jù)庫(kù),例如:

          如上圖所示,其可能的執(zhí)行流程順序?yàn)椋?/span>
          • 客戶端1 觸發(fā)更新數(shù)據(jù)A的邏輯
          • 客戶端2 觸發(fā)查詢數(shù)據(jù)A的邏輯
          • 客戶端1 更新緩存中的數(shù)據(jù)A,返回
          • 客戶端2 查詢緩存中的數(shù)據(jù)A,命中返回
          • 緩存異步更新數(shù)據(jù)A到數(shù)據(jù)庫(kù)中
          這種方式的優(yōu)勢(shì)是讀寫的性能都非常好,基本上只要操作完內(nèi)存后就返回給客戶端了,但是其是非強(qiáng)一致性,存在丟失數(shù)據(jù)的情況。
          如果在緩存異步將數(shù)據(jù)更新到數(shù)據(jù)庫(kù)中時(shí),緩存服務(wù)掛了,此時(shí)未更新到數(shù)據(jù)庫(kù)中的數(shù)據(jù)就丟失了。


          總結(jié)

          上面講到的幾種緩存更新的設(shè)計(jì)方式,都是前人總結(jié)出來(lái)的經(jīng)驗(yàn),這些方式或多或少都有一些弊端,并不完美,實(shí)際上也很難有完美的設(shè)計(jì)。大家在做系統(tǒng)設(shè)計(jì)的時(shí)候,也不要去追求完美,要有一些取舍,找到一種最適合自己業(yè)務(wù)場(chǎng)景的方式就行。

          最后,關(guān)注公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)回復(fù):2T,可以獲取我整理的 Java 系列面試題和答案,非常齊全


          正文結(jié)束


          推薦閱讀 ↓↓↓

          1.IDEA 28 個(gè)天花板技巧,YYDS!

          2.Alibaba開源內(nèi)網(wǎng)高并發(fā)編程手冊(cè).pdf

          3.程序員一般可以從什么平臺(tái)接私活?

          4.40歲,剛被裁,想說(shuō)點(diǎn)啥。

          5.為什么國(guó)內(nèi) 996 干不過(guò)國(guó)外的 955呢?

          6.中國(guó)的鐵路訂票系統(tǒng)在世界上屬于什么水平?                        

          7.15張圖看懂瞎忙和高效的區(qū)別!

          瀏覽 50
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲青青草在线 | 国产欧美久久精品 | 亚州中文久久精品无码 | 国产美女91 呻吟求XX网站 | 亚洲免费观看高清在线观看 |