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

Redis高級(jí)系列-緩存雙寫一致性

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

Redis高級(jí)系列-緩存雙寫一致性

1. 什么叫做緩存雙寫一致性?

Redis緩存雙寫一致性是指在更新數(shù)據(jù)庫數(shù)據(jù)后,同時(shí)更新緩存數(shù)據(jù)以保持?jǐn)?shù)據(jù)一致性的策略,總的來說,就是寫入redis寫入數(shù)據(jù)庫的數(shù)據(jù)要保持一致

2. 緩存雙寫一致性有那些解決方案?

2.1 Cache Aside Pattern(旁路緩存模式)

旁路緩存模式,字面意思理解:緩存是旁路,緩存相對(duì)與應(yīng)用程序和數(shù)據(jù)庫是旁路,應(yīng)用程序可以直接繞過緩存訪問數(shù)據(jù)庫

Redis高級(jí)系列-緩存雙寫一致性,Redis,緩存,redis

在Cache Aside模式中,應(yīng)用程序首先從緩存中讀取數(shù)據(jù),如果緩存中不存在,則從數(shù)據(jù)庫中讀取數(shù)據(jù),并將數(shù)據(jù)寫入緩存中。在更新數(shù)據(jù)時(shí),應(yīng)用程序首先更新數(shù)據(jù)庫中的數(shù)據(jù),然后刪除緩存中的數(shù)據(jù)。當(dāng)下一次請(qǐng)求到來時(shí),應(yīng)用程序會(huì)從數(shù)據(jù)庫中讀取最新的數(shù)據(jù),并將其寫入緩存中

那為什么要先更新數(shù)據(jù)庫在刪除緩存了?我們?cè)倏纯磶追N更新策略

策略 是否是多線程 場(chǎng)景 現(xiàn)象
先刪除緩存再更新數(shù)據(jù)庫 刪除緩存成功但數(shù)據(jù)庫更新失敗 應(yīng)用程序從數(shù)據(jù)庫中讀到舊值
緩存刪除成功但數(shù)據(jù)庫再更新中…有并發(fā)讀請(qǐng)求 并發(fā)讀請(qǐng)求從數(shù)據(jù)庫讀到舊值,并回寫到redis,導(dǎo)致后續(xù)都從redis讀取到舊值
先更新數(shù)據(jù)庫再刪除緩存 數(shù)據(jù)庫更新成功,但緩存刪除失敗 應(yīng)用程序從redis讀取到舊值
數(shù)據(jù)庫更新成功,但緩存再刪除中…有并發(fā)讀請(qǐng)求 并發(fā)讀請(qǐng)求讀取到舊值
先更新緩存再更新數(shù)據(jù)庫 更新緩存成功但更新數(shù)據(jù)庫失敗 緩存和數(shù)據(jù)庫數(shù)據(jù)不一致(不推薦,一般數(shù)據(jù)庫作為兜底方案)
更新緩存成功但數(shù)據(jù)庫再更新中 緩存和數(shù)據(jù)庫數(shù)據(jù)不一致(不推薦,一般數(shù)據(jù)庫作為兜底方案)
先更新數(shù)據(jù)庫再更新緩存 更新數(shù)據(jù)庫成功但緩存更新失敗 應(yīng)用程序讀取到舊值
更新數(shù)據(jù)庫成功但緩存再更新中…有并發(fā)讀請(qǐng)求 并發(fā)讀請(qǐng)求讀取到舊值
延遲雙刪

經(jīng)過我們對(duì)Cache Aside Pattern四種方案的八種場(chǎng)景進(jìn)行仔細(xì)分析,我們大體上確定了先更數(shù)據(jù)庫再刪緩存的方案。但是這種方案也并不完美,假設(shè)我們更新數(shù)據(jù)庫成功了,刪除緩存失敗了,那么同樣會(huì)出現(xiàn)一致性問題。為了解決這種場(chǎng)景下的一致性問題,我們進(jìn)一步引入了延遲雙刪方案來解決。

Redis高級(jí)系列-緩存雙寫一致性,Redis,緩存,redis

  • 為什么要做兩次緩存刪除呢?

從上圖“延遲雙刪”中我們可以很清晰地看到,數(shù)據(jù)庫的更新是在首次的緩存刪除成功后進(jìn)行的,這樣就有效避地免了“先更數(shù)據(jù)庫再刪緩存”方案中可能出現(xiàn)的數(shù)據(jù)庫更新成功緩存刪除失敗導(dǎo)致的一致性問題。第二次的緩存刪除是為了避免在執(zhí)行更新數(shù)據(jù)庫操作完成之前其它線程讀取數(shù)據(jù)庫并更新緩存而導(dǎo)致的一致性問題。

  • 為什么第二次緩存刪除又要延遲執(zhí)行呢?

試想,如果我們不做第二次的延遲刪除,而是更新數(shù)據(jù)庫后立即刪除會(huì)出什么問題?有沒有可能其它讀請(qǐng)求線程在更新數(shù)據(jù)庫之前讀取了數(shù)據(jù),并在第二次立即刪除緩存之后更新了緩存。很明顯,延遲刪除就是為了讓可能存在的其它讀請(qǐng)求線程盡可能地在更新完緩存后再執(zhí)行緩存刪除操作。這樣一通操作后,數(shù)據(jù)庫是最新的數(shù)據(jù)了,緩存里沒有數(shù)據(jù),后面的讀請(qǐng)求線程又可以拿到數(shù)據(jù)庫的最新數(shù)據(jù)寫入緩存了。

  • 延遲刪除具體需要延遲多長(zhǎng)時(shí)間?

對(duì)于這個(gè)具體需要延遲多長(zhǎng)時(shí)間,其實(shí)沒有絕對(duì)的標(biāo)準(zhǔn),唯一的標(biāo)準(zhǔn)就是根據(jù)讀請(qǐng)求的耗時(shí)來確定,讀請(qǐng)求越耗時(shí),延遲時(shí)間越長(zhǎng)。一般情況下我們?cè)O(shè)置的延遲時(shí)間為1秒。

重試刪除

在上面的延遲雙刪方案中,如果我們思考,其實(shí)還是有諸多問題的。比如:在延遲雙刪的讀寫場(chǎng)景中,如果第二次緩存刪除失敗了,同樣會(huì)出現(xiàn)一致性問題。那么刪除失敗了,重試幾次不就好了嗎?基于這個(gè)思想我們進(jìn)一步引入了重試刪除方案來解決

Redis高級(jí)系列-緩存雙寫一致性,Redis,緩存,redis

重試刪除確實(shí)很大程度上解決了一致性問題,并且邏輯非常簡(jiǎn)單。唯一的不足可能就是需要引入消息隊(duì)列,并且業(yè)務(wù)代碼也會(huì)有一定的侵入。那么有沒有既能夠保證最終一致性,又能夠解耦的方案呢?我們繼續(xù)往下面看

binlog訂閱異步刪除

Redis高級(jí)系列-緩存雙寫一致性,Redis,緩存,redis

Redis高級(jí)系列-緩存雙寫一致性,Redis,緩存,redis

binlog訂閱異步刪除確實(shí)也能解決一致性問題,對(duì)代碼也無任何侵入,但是整個(gè)架構(gòu)復(fù)雜,中小項(xiàng)目一般都用不上。

2.2 Read Through/Write Through(讀寫穿透)

該策略又被稱為讀穿/寫穿策略,和CacheAside策略的緩存數(shù)據(jù)與數(shù)據(jù)庫數(shù)據(jù)為準(zhǔn)不同,該策略的核心是用戶只與緩存層交互(應(yīng)用程序只與緩存或者中間層、緩存抽象層交互),由緩存層與數(shù)據(jù)庫通信,寫入或讀取數(shù)據(jù)。

在讀取數(shù)據(jù)時(shí),通過緩存層進(jìn)行讀取,若緩存存在則直接返回,若不存在則由緩存層拉取數(shù)據(jù)庫數(shù)據(jù)到緩存中并返回。
在寫數(shù)據(jù)時(shí),通過緩存層進(jìn)行寫入,若緩存存在則直接寫入緩存中并同步到數(shù)據(jù)庫,若不存在則寫入數(shù)據(jù)庫中。

Redis高級(jí)系列-緩存雙寫一致性,Redis,緩存,redis

使用場(chǎng)景

適用于讀多寫多的場(chǎng)景,數(shù)據(jù)一致性要求較高的場(chǎng)景。

2.3 Write Behind(后寫或異步寫)

Write Behind Caching是一種將緩存和數(shù)據(jù)庫異步寫入的緩存模式。在Write Behind Caching模式中,應(yīng)用程序首先將更新操作寫入緩存中,然后異步地將更新操作寫入數(shù)據(jù)庫中。當(dāng)下一次請(qǐng)求到來時(shí),應(yīng)用程序會(huì)從緩存中讀取數(shù)據(jù),并將其寫入數(shù)據(jù)庫中。
Redis高級(jí)系列-緩存雙寫一致性,Redis,緩存,redis

使用場(chǎng)景

適用于寫多讀少的場(chǎng)景,數(shù)據(jù)一致性要求不高的場(chǎng)景

3. 總結(jié)

在使用Redis緩存時(shí),應(yīng)根據(jù)具體的業(yè)務(wù)場(chǎng)景和需求選擇合適的緩存模式。Cache Aside模式簡(jiǎn)單易用,適用于讀多寫少的場(chǎng)景;Read/Write Through模式完全解耦緩存和數(shù)據(jù)庫,適用于讀多寫多的場(chǎng)景;Write Behind Caching模式可以提高寫入性能,適用于寫多讀少的場(chǎng)景。在實(shí)際應(yīng)用中,可以根據(jù)具體的業(yè)務(wù)需求和性能要求,選擇合適的緩存模式,以提高系統(tǒng)的性能和穩(wěn)定性。文章來源地址http://www.zghlxwxcb.cn/news/detail-808057.html

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

本文來自互聯(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】聊一下緩存雙寫一致性

    【Redis】聊一下緩存雙寫一致性

    緩存雖然可以提高查詢數(shù)據(jù)的的性能,但是在緩存和數(shù)據(jù) 進(jìn)行更新的時(shí)候 其實(shí)會(huì)出現(xiàn)數(shù)據(jù)不一致現(xiàn)象,而這個(gè)不一致其實(shí)可能會(huì)給業(yè)務(wù)來帶一定影響。無論是Redis 分布式緩存還是其他的緩存機(jī)制都面臨這樣的問題。 數(shù)據(jù)一致性 緩存中有數(shù)據(jù),那么緩存的數(shù)據(jù)和數(shù)據(jù)庫的數(shù)據(jù)

    2024年02月06日
    瀏覽(25)
  • Redis緩存雙寫一致性之更新策略

    Redis緩存雙寫一致性之更新策略

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

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

    Redis緩存問題:穿透,擊穿,雪崩,雙寫一致性等

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

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

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

    提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 如何監(jiān)聽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)聽捕捉到MySQL的二進(jìn)制binlog日志文件改動(dòng),并通過Jav

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

    Redis雙寫一致性?

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

    2024年02月16日
    瀏覽(21)
  • Redis(十四)雙寫一致性工程案例

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

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

    2024年02月21日
    瀏覽(22)
  • 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與db的雙寫一致性

    ? ? 如何保證redis與db的雙寫一致性?這是一個(gè)十分熱門的面試話題。 如何理解“一致性”這個(gè)概念?“事務(wù)”中“一致性”的定義是: 事務(wù)執(zhí)行前后,數(shù)據(jù)從一個(gè)合法性狀態(tài)變換到另外一個(gè)合法性狀態(tài)。? 比喻說,更新前:redis中記錄的是100,db中記錄的也是100。更新后:?

    2024年02月07日
    瀏覽(25)
  • [優(yōu)雅的面試]MySQL與Redis雙寫一致性方案

    [優(yōu)雅的面試]MySQL與Redis雙寫一致性方案

    前言 由于緩存的高并發(fā)和高性能已經(jīng)在各種項(xiàng)目中被廣泛使用,在讀取緩存這方面基本都是一致的,大概都是按照下圖的流程進(jìn)行操作: 但是在更新緩存方面,是更新完數(shù)據(jù)庫再更新緩存還是直接刪除緩存呢?又或者是先刪除緩存再更新數(shù)據(jù)庫?在這一點(diǎn)上就值得探討了。

    2024年01月21日
    瀏覽(26)
  • MySQL與Redis數(shù)據(jù)雙寫一致性工程落地案例

    MySQL與Redis數(shù)據(jù)雙寫一致性工程落地案例

    多個(gè)線程同時(shí)去查詢數(shù)據(jù)庫的這條數(shù)據(jù),那么我們可以在第一個(gè)查詢數(shù)據(jù)的請(qǐng)求上使用一個(gè) 互斥鎖來鎖住它。 其他的線程走到這一步拿不到鎖就等著,等第一個(gè)線程查詢到了數(shù)據(jù),然后做緩存。 后面的線程進(jìn)來發(fā)現(xiàn)已經(jīng)有緩存了,就直接走緩存。 ? canal [k?\\\'n?l],中文翻譯

    2024年02月03日
    瀏覽(31)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包