国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價(jià)值的文章主要介紹了MySQL和Redis如何保證數(shù)據(jù)一致性?。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

由于緩存的高并發(fā)和高性能已經(jīng)在各種項(xiàng)目中被廣泛使用,在讀取緩存這方面基本都是一致的,大概都是按照下圖的流程進(jìn)行操作:

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

但是在更新緩存方面,是更新完數(shù)據(jù)庫再更新緩存還是直接刪除緩存呢?又或者是先刪除緩存再更新數(shù)據(jù)庫?在這一點(diǎn)上就值得探討了。

一致性方案

在實(shí)際項(xiàng)目開發(fā)中需要保證數(shù)據(jù)庫和緩存中的數(shù)據(jù)一致,否則人家充值了100塊,不斷刷新卻還是顯示0.01元,豈不是尷尬?從理論上來說,為緩存設(shè)置過期時(shí)間是最終保證數(shù)據(jù)一致性的解決方案,采用這種方案的話,所有的寫操作都是以數(shù)據(jù)庫為準(zhǔn),如果數(shù)據(jù)庫寫入成功但是緩存更新失敗,只要緩存到過期時(shí)間之后后面讀緩存時(shí)自然會在數(shù)據(jù)庫中讀取新的值然后更新緩存。接下來探討的思路主要的方向是在不依賴為緩存設(shè)置過期時(shí)間的前提下如何保證數(shù)據(jù)一致性。這里主要探討三種方案:

①先更新數(shù)據(jù)庫,再更新緩存

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

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

先更新數(shù)據(jù)庫再更新緩存

這種方案是普遍被反對的(在我的認(rèn)知范圍中~),為啥呢?為啥這種方案就被反對呢?原因主要有兩方面,請聽我細(xì)細(xì)道來:

首先從數(shù)據(jù)安全方面考慮,如果同時(shí)有請求A和請求B同時(shí)進(jìn)行操作,A先更新了數(shù)據(jù)庫的一條數(shù)據(jù),隨后B馬上有更新了該條數(shù)據(jù),但是可能因?yàn)榫W(wǎng)絡(luò)延遲等原因,B卻比A先更新了緩存,就會出現(xiàn)一種什么情況呢?緩存中的數(shù)據(jù)并不最新的B更新過的數(shù)據(jù),就導(dǎo)致了數(shù)據(jù)不一致的情況。

其次從業(yè)務(wù)場景方面考慮,如果是一個(gè)寫數(shù)據(jù)庫較多而讀數(shù)據(jù)庫較少的業(yè)務(wù),如果采用這種方案就會導(dǎo)致數(shù)據(jù)還沒讀緩存就會被頻繁更新,白白浪費(fèi)性能。

綜合以上兩方面的考慮,這種方案果斷pass。下面的兩種方案就是爭議較大的兩種方案了,到底是先刪緩存再更新數(shù)據(jù)庫還是先更新數(shù)據(jù)庫再刪除緩存?

先刪緩存再更新數(shù)據(jù)庫

如果同時(shí)有一個(gè)請求A進(jìn)行更新操作,請求B進(jìn)行查詢操作,就可能會出現(xiàn)A請求進(jìn)行寫操作前會刪除緩存,B請求剛好此時(shí)進(jìn)來發(fā)現(xiàn)緩存是空的,B請求就會查詢數(shù)據(jù)庫,如果此時(shí)A請求的寫操作還未完成,B請求查詢到的就還是舊的值,還是會將舊的值寫入緩存,A請求將新的值寫入數(shù)據(jù)庫,此時(shí)就會導(dǎo)致數(shù)據(jù)不一致的問題,如果不采用給緩存設(shè)置過期時(shí)間的策略,該數(shù)據(jù)永遠(yuǎn)都是臟數(shù)據(jù)。

解決這種情況可以采用延時(shí)雙刪的策略,就是在更新數(shù)據(jù)庫之前先刪除緩存,然后對數(shù)據(jù)庫進(jìn)行寫入操作,數(shù)據(jù)庫更新完成之后再次進(jìn)行刪除緩存的操作,目的是刪除讀請求可能造成的緩存臟數(shù)據(jù),第二次刪除緩存之前可以休眠幾秒,具體時(shí)間開發(fā)者可以評估一下自己項(xiàng)目讀數(shù)據(jù)業(yè)務(wù)邏輯的耗時(shí),然后在該耗時(shí)基礎(chǔ)上加幾百ms即可,這么做的目的就是確保讀請求結(jié)束寫請求可以刪除讀請求造成的臟數(shù)據(jù)。如果MySQL采用的是讀寫分離的架構(gòu),可能由于主從延時(shí)的原因造成數(shù)據(jù)不一致,可以在寫操作完成之后根據(jù)主從延時(shí)時(shí)間休眠一下然后再進(jìn)行刪除緩存的操作。延時(shí)雙刪的偽代碼如下:

# 偽代碼
def delay_delete():
    redis.delete('name')  # 更新數(shù)據(jù)庫之前先刪除緩存
    sql = 'update info set name='lili' where id=1;'  # 更新數(shù)據(jù)庫
    cursor.execute(sql)  
    time.sleep(1)  # 如果mysql是主從架構(gòu)則休眠主從延時(shí)的時(shí)間再多幾百ms
    redis.delete('name')  # 再次刪除緩存

那會不會存在第二次刪除緩存失敗的情況呢?如果第二次刪除失敗,還是會造成緩存和數(shù)據(jù)庫不一致的問題,又如何解決呢?且看下一種方案。

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

老外提出了一個(gè)緩存更新方案Cache?AsidepatternCache-Aside patternCache?Asidepattern,文章中提到**應(yīng)用程序應(yīng)該從cache中獲取數(shù)據(jù),如果獲取成功直接返回,如果沒有獲取成功,則從數(shù)據(jù)庫中獲取,成功后放到緩存中,更新數(shù)據(jù)時(shí)應(yīng)該先把數(shù)據(jù)存到數(shù)據(jù)庫中成功后再讓緩存失效。**原文如下

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

If an application updates information, it can follow the write-through strategy by making the modification to the data store, and by invalidating the corresponding item in the cache.

When the item is next required, using the cache-aside strategy will cause the updated data to be retrieved from the data store and added back into the cache.

這種方案會不會產(chǎn)生數(shù)據(jù)不一致的情況呢?比如下述這種情況:

有兩個(gè)請求A和B,A進(jìn)行查詢同時(shí)B進(jìn)行更新,假設(shè)發(fā)生下述情況:

①此時(shí)緩存剛好失效

②請求A 就會去查詢數(shù)據(jù)庫得到一個(gè)舊的值

③請求B將新的值寫入數(shù)據(jù)庫

④請求B寫入成功后刪除緩存

⑤請求A將查到的機(jī)制寫入緩存,產(chǎn)生臟數(shù)據(jù)...

如果發(fā)聲上述情況,確實(shí)會產(chǎn)生數(shù)據(jù)不一致的情況,但是XDM想一想,發(fā)生這種情況的概率是多少呢?如果先要產(chǎn)生這種結(jié)果,就必須有一個(gè)條件,就是請求B的操作時(shí)間非常短,短到什么程度呢,就是請求B寫入數(shù)據(jù)庫的操作要比請求A從數(shù)據(jù)庫中讀取數(shù)據(jù)的速度要快(因?yàn)閞edis非常快,因此操作redis的時(shí)間可以暫且忽略),只有這種情況下④才可能比⑤先發(fā)聲,但是數(shù)據(jù)庫的讀操作要遠(yuǎn)比寫操作快的多,不然做讀寫分離干嘛呢?所以這種情況發(fā)生的概率是非常非常非常的低,但是如果強(qiáng)迫癥患者出現(xiàn)必須要解決怎么辦呢?就可以采用給緩存設(shè)置過期時(shí)間或者采用第二種方案的延時(shí)雙刪策略,保證讀請求完成之后在進(jìn)行刪除操作。

最后的問題

還有問題呀,就是最終解決方案三可能 出現(xiàn)的極低概率的數(shù)據(jù)不一致的方案是采用方案二的延時(shí)雙刪策略,可是在方案二中也說了,如果出現(xiàn)緩存刪除失敗的情況咋辦?那不是還會出現(xiàn)數(shù)據(jù)不一致的問題嗎?這個(gè)問題到底如何解決呢?這里提供一個(gè)重試機(jī)制,刪除失敗就重試一次唄,這里提供一種重試的方案。

①更新數(shù)據(jù)庫

②由于各種原因緩存刪除失敗

③將刪除失敗的緩存放入消息隊(duì)列中

④業(yè)務(wù)代碼從消息隊(duì)列中獲取需要?jiǎng)h除的key

⑤繼續(xù)嘗試刪除操作,直到成功

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

?文章來源地址http://www.zghlxwxcb.cn/news/detail-428294.html

到了這里,關(guān)于MySQL和Redis如何保證數(shù)據(jù)一致性?的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Redis與MySQL雙寫一致性如何保證

    Redis與MySQL雙寫一致性如何保證

    前言 在分布式系統(tǒng)中,數(shù)據(jù)一致性是一個(gè)重要的問題。當(dāng)我們使用Redis和MySQL這兩種不同的數(shù)據(jù)庫時(shí),如何保證它們之間的雙寫一致性是一個(gè)需要解決的難題。本文將探討Redis與MySQL雙寫一致性的保證方法。 什么是雙寫一致性? 指的是當(dāng)我們更新了數(shù)據(jù)庫的數(shù)據(jù)之后redis中的數(shù)

    2024年02月09日
    瀏覽(28)
  • Redis如何保證緩存和數(shù)據(jù)庫一致性?

    現(xiàn)在我們在面向增刪改查開發(fā)時(shí),數(shù)據(jù)庫數(shù)據(jù)量大時(shí)或者對響應(yīng)要求較快,我們就需要用到Redis來拿取數(shù)據(jù)。 Redis:是一種高性能的內(nèi)存數(shù)據(jù)庫,它將數(shù)據(jù)以鍵值對的形式存儲在內(nèi)存中,具有讀寫速度快、支持多種數(shù)據(jù)類型、原子性操作、豐富的特性等優(yōu)勢。 優(yōu)勢: 性能極高

    2024年01月16日
    瀏覽(41)
  • Redis---數(shù)據(jù)庫和緩存如何保證一致性?

    用「讀 + 寫」請求的并發(fā)的場景來分析: 假如某個(gè)用戶數(shù)據(jù)在緩存中不存在,請求 A 讀取數(shù)據(jù)時(shí)從數(shù)據(jù)庫中查詢到年齡為 20,在未寫入緩存中時(shí)另一個(gè)請求 B 更新數(shù)據(jù)。它更新數(shù)據(jù)庫中的年齡為 21,并且清空緩存。這時(shí)請求 A 把從數(shù)據(jù)庫中讀到的年齡為 20 的數(shù)據(jù)寫入到緩存

    2024年01月24日
    瀏覽(27)
  • 如何保證Redis緩存和數(shù)據(jù)庫的一致性問題

    熟練掌握Redis緩存技術(shù)? 那么請問Redis緩存中有幾種讀寫策略,又是如何保證與數(shù)據(jù)庫的一致性問題 今天來聊一聊常用的三種緩存讀寫策略 首先我們來思考一個(gè)問題 寫 先更新緩存 再更新數(shù)據(jù)庫 首先如果緩存更新成功但數(shù)據(jù)庫更新失敗,會導(dǎo)致數(shù)據(jù)不一致的問題 其次當(dāng)請求

    2024年02月14日
    瀏覽(23)
  • 126、高頻Redis面試題:如何保證Redis和數(shù)據(jù)庫數(shù)據(jù)一致性

    126、高頻Redis面試題:如何保證Redis和數(shù)據(jù)庫數(shù)據(jù)一致性

    問題:如果數(shù)據(jù)庫中的某條數(shù)據(jù)放入緩存后,又馬上被更新了,那我們應(yīng)該如何更新緩存 缺點(diǎn): 如果先更新緩存成功,在更新數(shù)據(jù)庫的時(shí)候失敗,這時(shí)候會導(dǎo)致數(shù)據(jù)不一致;緩存的作用是不是臨時(shí)將我們數(shù)據(jù)保存在內(nèi)存,便于提高查詢速度;但是如果某條數(shù)據(jù)在數(shù)據(jù)庫中都

    2024年02月13日
    瀏覽(27)
  • MySQL是如何保證數(shù)據(jù)一致性的?

    MySQL是如何保證數(shù)據(jù)一致性的?

    通過上文《MySQL是如何保證數(shù)據(jù)不丟失的?》可以了解DML的操作流程以及數(shù)據(jù)的持久化機(jī)制。對于一個(gè)數(shù)據(jù)庫而言,除了數(shù)據(jù)的持久性、不丟失之外,一致性也是非常重要的,不然這個(gè)數(shù)據(jù)是沒有任何意義的。在使用MySQL時(shí),數(shù)據(jù)不一致的情況也可能出現(xiàn),所以,本文就來看看

    2024年02月03日
    瀏覽(31)
  • redis面試題目-如何保證數(shù)據(jù)庫與緩存的數(shù)據(jù)一致性

    原視頻:https://www.bilibili.com/video/BV1Km4y1r75f?p=62vd_source=fa75329ae3880aa55609265a0e9f5d34 由于緩存和數(shù)據(jù)庫是分開的,無法做到原子性的同時(shí)進(jìn)行數(shù)據(jù)修改,可能出現(xiàn)緩存更新失敗,或者數(shù)據(jù)庫更新失敗的情況,這時(shí)候會出現(xiàn)數(shù)據(jù)不一致,影響前端業(yè)務(wù) 先更新數(shù)據(jù)庫,再更新緩存。緩

    2024年02月05日
    瀏覽(27)
  • Redis如何實(shí)現(xiàn)主從復(fù)制?有沒有辦法保證數(shù)據(jù)一致性?

    Redis通過主從復(fù)制(Master-Slave Replication)實(shí)現(xiàn)數(shù)據(jù)復(fù)制和高可用性。主節(jié)點(diǎn)負(fù)責(zé)接收和處理寫操作,并將數(shù)據(jù)同步到從節(jié)點(diǎn)上。 主從復(fù)制的實(shí)現(xiàn)步驟如下: 配置主從關(guān)系:在從節(jié)點(diǎn)上的配置文件中配置主節(jié)點(diǎn)的IP地址和端口號。 從節(jié)點(diǎn)連接主節(jié)點(diǎn):從節(jié)點(diǎn)啟動時(shí)會自動連接主

    2024年02月13日
    瀏覽(20)
  • 美團(tuán)二面:如何保證Redis與Mysql雙寫一致性?連續(xù)兩個(gè)面試問到了!

    Redis作為一款高效的內(nèi)存數(shù)據(jù)存儲系統(tǒng),憑借其優(yōu)異的讀寫性能和豐富的數(shù)據(jù)結(jié)構(gòu)支持,被廣泛應(yīng)用于緩存層以提升整個(gè)系統(tǒng)的響應(yīng)速度和吞吐量。尤其是在與關(guān)系型數(shù)據(jù)庫(如MySQL、PostgreSQL等)結(jié)合使用時(shí),通過將熱點(diǎn)數(shù)據(jù)存儲在Redis中,可以在很大程度上緩解數(shù)據(jù)庫的壓力

    2024年04月16日
    瀏覽(45)
  • redis的緩存更新策略以及如何保證redis與數(shù)據(jù)庫的數(shù)據(jù)一致性

    redis的緩存更新策略有這么幾種: 1、由應(yīng)用直接和redis以及數(shù)據(jù)庫相連接: ?? ??? ?查詢數(shù)據(jù)時(shí),應(yīng)用去redis中查詢,查不到的話再由應(yīng)用去數(shù)據(jù)庫中查詢,并將查詢結(jié)果放在redis; ?? ??? ?更新數(shù)據(jù)時(shí),由應(yīng)用去觸發(fā)redis數(shù)據(jù)的刪除以及數(shù)據(jù)庫的update。 2、應(yīng)用只跟redi

    2024年02月13日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包