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

Redis---緩存雙寫(xiě)一致性

這篇具有很好參考價(jià)值的文章主要介紹了Redis---緩存雙寫(xiě)一致性。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

一、什么是緩存雙寫(xiě)一致性呢?

?1.1 雙檢加鎖機(jī)制

?二、數(shù)據(jù)庫(kù)和緩存一致性的更新策略

2.1、先更新數(shù)據(jù)庫(kù),后更新緩存

?2.2 、先更新緩存,后更新數(shù)據(jù)庫(kù)

?2.3、先刪除緩存,在更新數(shù)據(jù)庫(kù)

延時(shí)雙刪的策略:

?2.4.先更新數(shù)據(jù)庫(kù),在刪除緩存(常用)

2.5、實(shí)際中是不可能做到強(qiáng)一致性的,那么怎么做到最終一致性呢?

三、canal中間件

3.1? ?canal工作原理

3.2 MySQL的主從復(fù)制?


一、什么是緩存雙寫(xiě)一致性呢?

  • 如果redis中有數(shù)據(jù)

    • 需要和數(shù)據(jù)庫(kù)中的值相同
  • 如果redis中無(wú)數(shù)據(jù)

    • 數(shù)據(jù)庫(kù)中的值是最新值,且準(zhǔn)備回寫(xiě)redis

緩存按照操作分

  • 只讀緩存? ? (就沒(méi)有同步這一說(shuō)法了)
  • 讀寫(xiě)緩存
    • 同步直寫(xiě)策略? ?(比如比較緊急的事情,沖了vip得立即生效
      • 寫(xiě)數(shù)據(jù)庫(kù)后也同步寫(xiě) redis 緩存,緩存中的數(shù)據(jù)和數(shù)據(jù)庫(kù)中的一致
      • 對(duì)于讀寫(xiě)緩存來(lái)說(shuō),要想保證緩存和數(shù)據(jù)庫(kù)中的數(shù)據(jù)一致
  • 異步緩寫(xiě)策略? ?(一般都是用這種)
    • 正常業(yè)務(wù)運(yùn)行中,mysql數(shù)據(jù)變動(dòng)了,但是可以在業(yè)務(wù)上容許出現(xiàn)一定時(shí)間后才作用于redis,比如倉(cāng)庫(kù)、物流系統(tǒng)
    • 異常情況出現(xiàn)了,不得不將失敗的動(dòng)作重新修補(bǔ),有可能需要借助kafka或者RabbitMQ等消息中間件,實(shí)現(xiàn)重寫(xiě)重試

Redis---緩存雙寫(xiě)一致性,緩存,redis,分布式

?1.1 雙檢加鎖機(jī)制

加鎖前從redis中查一次,加鎖后再查一次。

Redis---緩存雙寫(xiě)一致性,緩存,redis,分布式

多個(gè)線程同時(shí)去查詢數(shù)據(jù)庫(kù)的這條數(shù)據(jù),那么我們可以在第一個(gè)查詢數(shù)據(jù)的請(qǐng)求上使用一個(gè) 互斥鎖來(lái)鎖住它

其他的線程走到這一步拿不到鎖就等著,等第一個(gè)線程查詢到了數(shù)據(jù),然后做緩存。

后面的線程進(jìn)來(lái)發(fā)現(xiàn)已經(jīng)有緩存了,就直接走緩存。?

Redis---緩存雙寫(xiě)一致性,緩存,redis,分布式

?二、數(shù)據(jù)庫(kù)和緩存一致性的更新策略

一般都是以MySQL為準(zhǔn)。

給緩存設(shè)置過(guò)期時(shí)間,定期清理緩存并回寫(xiě),是保證最終一致性的解決方案。

我們可以對(duì)存入緩存的數(shù)據(jù)設(shè)置過(guò)期時(shí)間,所有的寫(xiě)操作以數(shù)據(jù)庫(kù)為準(zhǔn),對(duì)緩存操作只是盡最大努力即可。也就是說(shuō)如果數(shù)據(jù)庫(kù)寫(xiě)成功,緩存更新失敗,那么只要到達(dá)過(guò)期時(shí)間,則后面的讀請(qǐng)求自然會(huì)從數(shù)據(jù)庫(kù)中讀取新值然后回填緩存,達(dá)到一致性,切記,要以mysql的數(shù)據(jù)庫(kù)寫(xiě)入庫(kù)為準(zhǔn)

2.1、先更新數(shù)據(jù)庫(kù),后更新緩存

異常一:? ? ? ? 回寫(xiě)失敗會(huì)出現(xiàn)臟數(shù)據(jù)

Redis---緩存雙寫(xiě)一致性,緩存,redis,分布式

?異常二:? ? ? ?高并發(fā)下會(huì)出現(xiàn)數(shù)據(jù)覆蓋

Redis---緩存雙寫(xiě)一致性,緩存,redis,分布式

?2.2 、先更新緩存,后更新數(shù)據(jù)庫(kù)

我們一般是不用這種的,因?yàn)槲覀円话愣及袽ySQL作為根基

異常:? ? ? ?高并發(fā)下會(huì)出現(xiàn)數(shù)據(jù)覆蓋

Redis---緩存雙寫(xiě)一致性,緩存,redis,分布式

?2.3、先刪除緩存,在更新數(shù)據(jù)庫(kù)

當(dāng)有兩個(gè)線程:一個(gè)線程負(fù)責(zé)刪Redis,修改MySQL,? 另一個(gè)來(lái)查找redis

?如果數(shù)據(jù)庫(kù)更新失敗或者不及時(shí)就會(huì)發(fā)生異常

(1)請(qǐng)求A進(jìn)行寫(xiě)操作,刪除redis緩存后,工作正在進(jìn)行中,更新mysql......A還沒(méi)有徹底更新完mysql,還沒(méi)commit

(2)請(qǐng)求B開(kāi)工查詢,查詢r(jià)edis發(fā)現(xiàn)緩存不存在(被A從redis中刪除了)

(3)請(qǐng)求B繼續(xù),去數(shù)據(jù)庫(kù)查詢得到了mysql中的舊值(A還沒(méi)有更新完)

(4)請(qǐng)求B將舊值回寫(xiě)redis緩存

(5)請(qǐng)求A將新值寫(xiě)入mysql數(shù)據(jù)庫(kù)?

上述情況就會(huì)導(dǎo)致不一致的情形出現(xiàn)。?

時(shí)間
線程A
線程B
出現(xiàn)的問(wèn)題
t1
請(qǐng)求A進(jìn)行寫(xiě)操作,刪除緩存成功后,工作正在mysql進(jìn)行中......
t2
1 緩存中讀取不到,立刻讀mysql,由于A還沒(méi)有對(duì)mysql更新完,讀到的是舊值
2 還把從mysql讀取的舊值,寫(xiě)回了redis
1 A還沒(méi)有更新完mysql,導(dǎo)致B讀到了舊值
2 線程B遵守回寫(xiě)機(jī)制,把舊值寫(xiě)回redis,導(dǎo)致其它請(qǐng)求讀取的還是舊值,A白干了。
t3
A更新完mysql數(shù)據(jù)庫(kù)的值,over
redis是被B寫(xiě)回的舊值,
mysql是被A更新的新值。
出現(xiàn)了,數(shù)據(jù)不一致問(wèn)題。

總結(jié)一下:

先刪除緩存,再更新數(shù)據(jù)庫(kù)
如果數(shù)據(jù)庫(kù)更新失敗或超時(shí)或返回不及時(shí),導(dǎo)致B線程請(qǐng)求訪問(wèn)緩存時(shí)發(fā)現(xiàn)redis里面沒(méi)數(shù)據(jù),緩存缺失,B再去讀取mysql時(shí), 從數(shù)據(jù)庫(kù)中讀取到舊值,還寫(xiě)回redis,導(dǎo)致A白干了,o(╥﹏╥)o

改怎么解決呢?

延時(shí)雙刪的策略:

Redis---緩存雙寫(xiě)一致性,緩存,redis,分布式

?這個(gè)刪除該休眠多久呢?

Redis---緩存雙寫(xiě)一致性,緩存,redis,分布式

?因?yàn)檫@種同步淘汰機(jī)制加上了sleep,導(dǎo)致MySQL吞吐量降低怎么辦?

?Redis---緩存雙寫(xiě)一致性,緩存,redis,分布式

?2.4.先更新數(shù)據(jù)庫(kù),在刪除緩存(常用)

?這一種方法的弊端相對(duì)比較少

時(shí)間
線程A
線程B
出現(xiàn)的問(wèn)題
t1
更新數(shù)據(jù)庫(kù)中的值......
t2
?緩存中立刻命中,此時(shí)B讀取的是緩存舊值。
A還沒(méi)有來(lái)得及刪除緩存的值,導(dǎo)致B緩存命中讀到舊值。
t3
更新緩存的數(shù)據(jù),over
先更新數(shù)據(jù)庫(kù),再刪除緩存
假如緩存刪除失敗或者來(lái)不及,導(dǎo)致請(qǐng)求再次訪問(wèn)redis時(shí)緩存命中, 讀取到的是緩存舊值。

2.5、實(shí)際中是不可能做到強(qiáng)一致性的,那么怎么做到最終一致性呢?

需要用到消息隊(duì)列:kafka或者RabbitMQ

但是還是都需要是先更新數(shù)據(jù)庫(kù),再刪除緩存,這樣最多也就是數(shù)據(jù)暫時(shí)不一致,不會(huì)導(dǎo)致雪崩、擊穿啥的出現(xiàn)。

Redis---緩存雙寫(xiě)一致性,緩存,redis,分布式

1 可以把要?jiǎng)h除的緩存值或者是要更新的數(shù)據(jù)庫(kù)值暫存到消息隊(duì)列中(例如使用Kafka/RabbitMQ等)。
2 當(dāng)程序沒(méi)有能夠成功地刪除緩存值或者是更新數(shù)據(jù)庫(kù)值時(shí),可以從消息隊(duì)列中重新讀取這些值,然后再次進(jìn)行刪除或更新。
3 如果能夠成功地刪除或更新,我們就要把這些值從消息隊(duì)列中去除,以免重復(fù)操作,此時(shí),我們也可以保證數(shù)據(jù)庫(kù)和緩存的數(shù)據(jù)一致了,否則還需要再次進(jìn)行重試
4 如果重試超過(guò)的一定次數(shù)后還是沒(méi)有成功,我們就需要向業(yè)務(wù)層發(fā)送報(bào)錯(cuò)信息了,通知運(yùn)維人員。

三、canal中間件

能夠立刻感知到MySQL改變的有一個(gè)MySQL的binlog文件

我們需要一種技術(shù)來(lái)充當(dāng)兩者之前的吹哨人

這里有阿里研發(fā)的一種中間件canal

3.1? ?canal工作原理

Redis---緩存雙寫(xiě)一致性,緩存,redis,分布式

1.?canal 模仿MySQL的dump協(xié)議,假裝自己是MySQL的slave,向MySQL發(fā)送dump協(xié)議

2. MySQLmaster收到dump請(qǐng)求之后,便會(huì)給canal推送自身bin? log 變化給canal

3. cannal收到bin? log 消息并解析。

3.2 MySQL的主從復(fù)制?

Redis---緩存雙寫(xiě)一致性,緩存,redis,分布式

MySQL的主從復(fù)制將經(jīng)過(guò)如下步驟:

1、當(dāng) master 主服務(wù)器上的數(shù)據(jù)發(fā)生改變時(shí),則將其改變寫(xiě)入二進(jìn)制事件日志文件中;

2、salve 從服務(wù)器會(huì)在一定時(shí)間間隔內(nèi)對(duì) master 主服務(wù)器上的二進(jìn)制日志進(jìn)行探測(cè),探測(cè)其是否發(fā)生過(guò)改變,

如果探測(cè)到 master 主服務(wù)器的二進(jìn)制事件日志發(fā)生了改變,則開(kāi)始一個(gè) I/O Thread 請(qǐng)求 master 二進(jìn)制事件日志;

3、同時(shí) master 主服務(wù)器為每個(gè) I/O Thread 啟動(dòng)一個(gè)dump? Thread,用于向其發(fā)送二進(jìn)制事件日志;

4、slave 從服務(wù)器將接收到的二進(jìn)制事件日志保存至自己本地的中繼日志文件中;

5、salve 從服務(wù)器將啟動(dòng) SQL Thread 從中繼日志中讀取二進(jìn)制日志,在本地重放,使得其數(shù)據(jù)和主服務(wù)器保持一致;

6、最后 I/O Thread 和 SQL Thread 將進(jìn)入睡眠狀態(tài),等待下一次被喚醒;文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-553181.html

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

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

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

相關(guān)文章

  • Redis緩存雙寫(xiě)一致性之更新策略

    Redis緩存雙寫(xiě)一致性之更新策略

    你只要用緩存,就可能會(huì)涉及到redis緩存與數(shù)據(jù)庫(kù)雙存儲(chǔ)雙寫(xiě),你只要是雙寫(xiě),就一定會(huì)有數(shù)據(jù)一致性的問(wèn)題,那么你如何解決一致性問(wèn)題? 雙寫(xiě)一致性,你先動(dòng)緩存redis還是數(shù)據(jù)庫(kù)mysql哪一個(gè)?why? 延時(shí)雙刪你做過(guò)嗎?會(huì)有哪些問(wèn)題? 有這么一種情況,微服務(wù)查詢r(jià)edis無(wú)m

    2024年02月05日
    瀏覽(28)
  • Redis緩存問(wèn)題:穿透,擊穿,雪崩,雙寫(xiě)一致性等

    Redis緩存問(wèn)題:穿透,擊穿,雪崩,雙寫(xiě)一致性等

    在高并發(fā)場(chǎng)景下,數(shù)據(jù)庫(kù)往往是最薄弱的環(huán)節(jié),我們通常選擇使用 redis 來(lái)進(jìn)行緩存,以起到緩沖作用,來(lái)降低數(shù)據(jù)庫(kù)的壓力,但是一旦緩存出現(xiàn)問(wèn)題,也會(huì)導(dǎo)致數(shù)據(jù)庫(kù)瞬間壓力過(guò)大甚至崩潰,從而導(dǎo)致整個(gè)系統(tǒng)崩潰.今天就聊聊常見(jiàn)的 redis 緩存問(wèn)題. 緩存擊穿 緩存擊穿一般指redis中的一

    2024年04月27日
    瀏覽(31)
  • redis高級(jí)篇 緩存雙寫(xiě)一致性之更新策略

    redis高級(jí)篇 緩存雙寫(xiě)一致性之更新策略

    緩存通用查詢3部曲 redis 中數(shù)據(jù),返回redis 中的數(shù)據(jù) redis 中沒(méi)有,查詢數(shù)據(jù)庫(kù)并返回 完成第二部的同時(shí),將數(shù)據(jù)庫(kù)查詢結(jié)果寫(xiě)到redis,redis和數(shù)據(jù)庫(kù)數(shù)據(jù)一致. 談?wù)勲p寫(xiě)一致性的理解 1.如果redis 中有數(shù)據(jù):需要和數(shù)據(jù)庫(kù)中的相同 2.如果redis 中無(wú)數(shù)據(jù): 數(shù)據(jù)庫(kù)中的值如果是最新的

    2024年02月06日
    瀏覽(21)
  • 【redis】緩存雙寫(xiě)一致性之工程落地實(shí)現(xiàn)(下)

    【redis】緩存雙寫(xiě)一致性之工程落地實(shí)現(xiàn)(下)

    提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 如何監(jiān)聽(tīng)MySQL的變動(dòng)? MySQL有一個(gè)binlog日志 偽裝成從機(jī),從主機(jī)獲取二進(jìn)制文件 配置不在詳述 配置不再詳述 a、業(yè)務(wù)類: 當(dāng)MySQL進(jìn)行增刪改操作時(shí),后臺(tái)的canal會(huì)立刻監(jiān)聽(tīng)捕捉到MySQL的二進(jìn)制binlog日志文件改動(dòng),并通過(guò)Jav

    2023年04月19日
    瀏覽(22)
  • Redis雙寫(xiě)一致性?

    Redis雙寫(xiě)一致性?

    雙寫(xiě)一致性:當(dāng)修改了數(shù)據(jù)庫(kù)的數(shù)據(jù)也要同時(shí)更新緩存的數(shù)據(jù),緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)要保持一致。 Redis作為緩存,mysql的數(shù)據(jù)如何與redis進(jìn)行同步呢?(雙寫(xiě)一致性) 1.我們當(dāng)時(shí)做排行榜業(yè)務(wù)時(shí),把歷史榜單數(shù)據(jù)存儲(chǔ)到了緩存中。這個(gè)雖然也是熱點(diǎn)數(shù)據(jù),但是實(shí)時(shí)要求性不高。

    2024年02月16日
    瀏覽(21)
  • 緩存面試解析:穿透、擊穿、雪崩,一致性、分布式鎖、Redis過(guò)期,海量數(shù)據(jù)查找

    緩存面試解析:穿透、擊穿、雪崩,一致性、分布式鎖、Redis過(guò)期,海量數(shù)據(jù)查找

    在程序內(nèi)部使用緩存,比如使用map等數(shù)據(jù)結(jié)構(gòu)作為內(nèi)部緩存,可以快速獲取對(duì)象。通過(guò)將經(jīng)常使用的數(shù)據(jù)存儲(chǔ)在緩存中,可以減少對(duì)數(shù)據(jù)庫(kù)的頻繁訪問(wèn),從而提高系統(tǒng)的響應(yīng)速度和性能。緩存可以將數(shù)據(jù)保存在內(nèi)存中,讀取速度更快,能夠大大縮短數(shù)據(jù)訪問(wèn)的時(shí)間,提升用戶

    2024年02月14日
    瀏覽(37)
  • 深入理解高并發(fā)下的MySQL與Redis緩存一致性問(wèn)題(增刪改查數(shù)據(jù)緩存的一致性、Canal、分布式系統(tǒng)CAP定理、BASE理論、強(qiáng)、弱一致性、順序、線性、因果、最終一致性)

    一些小型項(xiàng)目,或極少有并發(fā)的項(xiàng)目,這些策略在無(wú)并發(fā)情況下,不會(huì)有什么問(wèn)題。 讀數(shù)據(jù)策略:有緩存則讀緩存,然后接口返回。沒(méi)有緩存,查詢出數(shù)據(jù),載入緩存,然后接口返回。 寫(xiě)數(shù)據(jù)策略:數(shù)據(jù)發(fā)生了變動(dòng),先刪除緩存,再更新數(shù)據(jù),等下次讀取的時(shí)候載入緩存,

    2024年03月20日
    瀏覽(29)
  • Redis(十四)雙寫(xiě)一致性工程案例

    Redis(十四)雙寫(xiě)一致性工程案例

    https://github.com/alibaba/canal 數(shù)據(jù)庫(kù)鏡像 數(shù)據(jù)庫(kù)實(shí)時(shí)備份 索引構(gòu)建和實(shí)時(shí)維護(hù)(拆分異構(gòu)索引、倒排索引等) 業(yè)務(wù) cache 刷新 帶業(yè)務(wù)邏輯的增量數(shù)據(jù)處理 傳統(tǒng)mysql主從復(fù)制原理 MySQL的主從復(fù)制將經(jīng)過(guò)如下步驟: 當(dāng) master 主服務(wù)器上的數(shù)據(jù)發(fā)生改變時(shí),則將其改變寫(xiě)入二進(jìn)制事件日志

    2024年02月21日
    瀏覽(22)
  • 分布式系統(tǒng)中數(shù)據(jù)庫(kù)和緩存雙寫(xiě)一致性的實(shí)現(xiàn)技術(shù)

    標(biāo)題:分布式系統(tǒng)中數(shù)據(jù)庫(kù)和緩存雙寫(xiě)一致性的實(shí)現(xiàn)技術(shù) 在分布式系統(tǒng)中,為了確保數(shù)據(jù)庫(kù)和緩存之間的數(shù)據(jù)一致性,雙寫(xiě)一致性成為了一個(gè)關(guān)鍵的挑戰(zhàn)。本文將深入探討如何利用一些常見(jiàn)的技術(shù)手段來(lái)保證數(shù)據(jù)庫(kù)和緩存的雙寫(xiě)一致性,以及通過(guò)舉例說(shuō)明這些技術(shù)是如何在實(shí)

    2024年01月16日
    瀏覽(85)
  • Redis與MySQL雙寫(xiě)一致性如何保證

    Redis與MySQL雙寫(xiě)一致性如何保證

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

    2024年02月09日
    瀏覽(28)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包