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

如何保證緩存和數(shù)據(jù)庫的數(shù)據(jù)一致性

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

1、錯誤的解決方案

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

若數(shù)據(jù)庫更新成功,刪除緩存操作失敗,則此后讀到的都是緩存中過期的數(shù)據(jù),造成不一致問題。

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

同刪除緩存策略一樣,若數(shù)據(jù)庫更新成功緩存更新失敗則會造成數(shù)據(jù)不一致問題。

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

如何保證緩存和數(shù)據(jù)庫的數(shù)據(jù)一致性

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

若緩存更新成功數(shù)據(jù)庫更新失敗, 則此后讀到的都是未持久化的數(shù)據(jù)。因為緩存中的數(shù)據(jù)是易失的,這種狀態(tài)非常危險。
如何保證緩存和數(shù)據(jù)庫的數(shù)據(jù)一致性

2、正確的解決方案

2.1、使用 CAS

CAS (Check-And-Set 或 Compare-And-Swap)是一種常見的保證并發(fā)安全的手段。CAS 當且僅當客戶端最后一次取值后該 key 沒有被其他客戶端修改的情況下,才允許當前客戶端將新值寫入。

func CAS(oldVal, newVal) {
    if cache.get() == oldVal {
        cache.set(newVal)
    }
}

如何保證緩存和數(shù)據(jù)庫的數(shù)據(jù)一致性

  • 目前一些兼容 Redis 協(xié)議的中間件已經(jīng)提供了 CAS 命令的支持,比如阿里的 Tair 以及騰訊的 Tendis。
  • Redis 官方本身是不支持CAS的操作,但是我們可以通過WATCHMULTI 命令實現(xiàn)類似的效果
  • WATCH 命令用于監(jiān)視一個或多個鍵的變化,并在某個鍵被修改后取消事務(wù),從而確保事務(wù)的原子性
  • MULTI 命令用于開始一個事務(wù),將多個命令打包成一個事務(wù),然后一次性執(zhí)行。如果在執(zhí)行事務(wù)期間有其他客戶端對事務(wù)中的鍵進行修改,那么事務(wù)會被取消

2.2、使用分布式鎖

CAS 假設(shè)發(fā)生并發(fā)問題的概率不大, 所以 CAS 也被稱為樂觀鎖。那么悲觀鎖能否解決我們的問題呢?

還是以「先更新數(shù)據(jù)庫,再更新緩存」方案中兩個寫線程競爭為例, 我們要求任何線程在寫入或讀取數(shù)據(jù)庫前都需要獲取排它鎖。
如何保證緩存和數(shù)據(jù)庫的數(shù)據(jù)一致性
分布式鎖同樣可以解決并發(fā)問題,只是成本可能略高。

2.3、使用消息隊列異步更新

使用消息隊列實現(xiàn)異步更新時,可以將緩存更新的請求發(fā)送到消息隊列中,由消息隊列異步地處理緩存更新操作。下面是一個簡單的案例:

假設(shè)有一個電商網(wǎng)站,需要對商品信息進行緩存。當用戶訪問商品詳情頁面時,先從緩存中讀取商品信息,如果緩存中沒有,則從數(shù)據(jù)庫中讀取。

  • 當商品信息發(fā)生變化時,需要更新緩存中的數(shù)據(jù)。這時可以通過消息隊列異步更新緩存,具體步驟如下:

  • 當商品信息發(fā)生變化時,先更新數(shù)據(jù)庫中的數(shù)據(jù)。

  • 將商品信息更新請求發(fā)送到消息隊列中。

  • 消息隊列異步地處理緩存更新操作,讀取最新的商品信息,并將其更新到緩存中。

這樣就可以保證緩存中的數(shù)據(jù)是最新的,避免了因為緩存中的數(shù)據(jù)過期而導(dǎo)致的數(shù)據(jù)不一致問題。同時,使用消息隊列可以提高更新的可靠性和性能,避免因為緩存更新失敗而導(dǎo)致的數(shù)據(jù)庫和緩存數(shù)據(jù)不一致問題。


為什么異步更新可以解決

  • 異步更新緩存:當商品信息發(fā)生變化時,先更新數(shù)據(jù)庫中的數(shù)據(jù),然后將緩存更新請求發(fā)送到消息隊列中,由消息隊列異步地處理緩存更新操作。這樣,即使緩存更新失敗,也不會影響數(shù)據(jù)庫中的數(shù)據(jù),僅僅是緩存中的數(shù)據(jù)不是最新的而已。

  • 消息隊列的可靠性:消息隊列通常具有高可靠性和高可用性,可以保證消息的可靠傳輸和處理。即使在消息隊列出現(xiàn)故障的情況下,也可以通過消息隊列的備份、重試等機制來保證消息的可靠性。因此,即使緩存更新失敗,也可以通過重試等機制來保證緩存最終被更新。


如果通過異步更新,更新緩存還是失敗了怎么辦

  • 重試更新緩存:當緩存更新失敗時,可以嘗試重新更新緩存。可以設(shè)置重試次數(shù)和重試間隔時間,避免因為頻繁重試而影響性能。

  • 回滾數(shù)據(jù)庫更新:當緩存更新失敗時,可以回滾數(shù)據(jù)庫中的更新操作,保證數(shù)據(jù)庫和緩存中的數(shù)據(jù)一致。但是,回滾操作可能會影響數(shù)據(jù)庫中的其他操作,需要考慮到這個問題。

  • 延遲更新緩存:當緩存更新失敗時,可以將緩存更新請求放入一個延遲隊列中,一段時間后再次嘗試更新緩存。這樣可以避免頻繁重試而影響性能,同時保證緩存最終被更新。

  • 使用讀寫分離:將讀請求和寫請求分別處理,讀請求從緩存中讀取數(shù)據(jù),寫請求先更新數(shù)據(jù)庫,再更新緩存。這樣可以避免因為緩存更新失敗而導(dǎo)致的數(shù)據(jù)不一致問題。

2.3、將數(shù)據(jù)庫更新和緩存更新放在同一個事務(wù)中

可以保證在事務(wù)執(zhí)行成功時,數(shù)據(jù)庫和緩存中的數(shù)據(jù)都被更新;在事務(wù)執(zhí)行失敗時,數(shù)據(jù)庫和緩存中的數(shù)據(jù)都不會被更新,保證了數(shù)據(jù)的一致性。

  • 要將MySQL和Redis放入同一個事務(wù)中,需要使用分布式事務(wù)處理框架,如XA或TCC。這些框架可以確保在整個事務(wù)過程中,MySQL和Redis的操作都能夠得到正確的協(xié)調(diào)和同步。

  • XA:XA是一種分布式事務(wù)處理標準,它可以確保在多個數(shù)據(jù)庫之間進行事務(wù)處理時,所有的操作都能夠得到正確的協(xié)調(diào)和同步。在MySQL和Redis中都有XA實現(xiàn),可以通過XA接口實現(xiàn)分布式事務(wù)。

  • TCC:TCC是一種補償性事務(wù)處理框架,它通過預(yù)留資源、確認資源和釋放資源三個步驟來實現(xiàn)分布式事務(wù)。在MySQL和Redis中都有TCC實現(xiàn),可以通過TCC接口實現(xiàn)分布式事務(wù)。

  • 需要注意的是,使用分布式事務(wù)框架會增加系統(tǒng)的復(fù)雜性和開銷,需要仔細考慮是否真正需要在MySQL和Redis之間實現(xiàn)分布式事務(wù)如果可以接受稍微降低一些數(shù)據(jù)一致性的風險,可以使用其他技術(shù)來實現(xiàn)MySQL和Redis之間的數(shù)據(jù)同步,如消息隊列、定時任務(wù)等。文章來源地址http://www.zghlxwxcb.cn/news/detail-418434.html

到了這里,關(guān)于如何保證緩存和數(shù)據(jù)庫的數(shù)據(jù)一致性的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • Redis緩存MySQL數(shù)據(jù)庫存儲二者如何保證數(shù)據(jù)一致性

    在大型互聯(lián)網(wǎng)應(yīng)用中,由于數(shù)據(jù)庫讀寫頻繁、壓力大等原因,我們通常會使用緩存來減少數(shù)據(jù)庫的訪問次數(shù),提高系統(tǒng)的性能。而Redis作為一個高性能的內(nèi)存數(shù)據(jù)庫,成為了緩存的首選方案之一。但是,緩存和數(shù)據(jù)庫之間存在數(shù)據(jù)一致性的問題,如何解決這個問題呢?本文將

    2023年04月19日
    瀏覽(27)
  • 如何保證緩存與數(shù)據(jù)庫雙寫時的數(shù)據(jù)一致性?

    如何保證緩存與數(shù)據(jù)庫雙寫時的數(shù)據(jù)一致性?

    背景:使用到緩存,無論是本地內(nèi)存做緩存還是使用?Redis?做緩存,那么就會存在數(shù)據(jù)同步的問題,因為配置信息緩存在內(nèi)存中,而內(nèi)存時無法感知到數(shù)據(jù)在數(shù)據(jù)庫的修改。這樣就會造成數(shù)據(jù)庫中的數(shù)據(jù)與緩存中數(shù)據(jù)不一致的問題。 共有四種方案: 先更新數(shù)據(jù)庫,后更新緩

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

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

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

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

    2024年02月13日
    瀏覽(25)
  • 怎么保證緩存與數(shù)據(jù)庫的最終一致性?

    怎么保證緩存與數(shù)據(jù)庫的最終一致性?

    目錄 零.讀數(shù)據(jù)的標準操作 一.Cache aside Patten--旁路模式 二.Read/Write Through Pattern--讀寫穿透 三.Write Back?Pattern--寫回 四.運用canal監(jiān)聽mysql的binlog實現(xiàn)緩存同步 這里想說的是不管哪種模式讀操作都是一樣的,這是一種統(tǒng)一的規(guī)范: 但寫操作和同步策略卻有不同。 這個是最常見的

    2024年04月08日
    瀏覽(26)
  • 如何保證ES和數(shù)據(jù)庫的數(shù)據(jù)一致性?

    如何保證ES和數(shù)據(jù)庫的數(shù)據(jù)一致性?

    在業(yè)務(wù)中,我們通常需要把數(shù)據(jù)庫中的數(shù)據(jù)變更同步到ES中,那么如何保證數(shù)據(jù)庫和ES的一致性呢?通常有以下幾種做法: 雙寫 在代碼中,對數(shù)據(jù)庫和ES進行雙寫,并且先操作本地數(shù)據(jù)庫,后操作ES,而且還需要把兩個操作放到一個事務(wù)中: ?在以上邏輯中,如果寫數(shù)據(jù)庫成功

    2024年04月28日
    瀏覽(22)
  • mysql和redis如何保證數(shù)據(jù)庫一致性

    如果對于小公司的單機服務(wù)器來說在更新和刪除mysql數(shù)據(jù)的同時對redis緩存進行更新或者刪除就行,一般有兩個選擇,例如: 先更新MySQL,后刪除(或更新)Redis 先刪除(或更新)Redis,后更新MySQL 但是不管使用其中哪種方式,都存在兩個可能的問題: 由于第一步與第二步并不是原

    2023年04月24日
    瀏覽(25)
  • 126、高頻Redis面試題:如何保證Redis和數(shù)據(jù)庫數(shù)據(jù)一致性

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

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

    2024年02月13日
    瀏覽(27)
  • Redis如何保障緩存與數(shù)據(jù)庫的數(shù)據(jù)一致性問題?

    Redis如何保障緩存與數(shù)據(jù)庫的數(shù)據(jù)一致性問題?

    目錄 一.最經(jīng)典的數(shù)據(jù)庫加緩存的雙寫雙刪模式 二. 高并發(fā)場景下的緩存+數(shù)據(jù)庫雙寫不一致問題分析與解決方案設(shè)計 三、上面高并發(fā)的場景下,該解決方案要注意的問題 1.1 Cache Aside Pattern概念以及讀寫邏輯 (1)讀的時候,先讀緩存,緩存沒有的話,那么就讀數(shù)據(jù)庫,然后取

    2023年04月21日
    瀏覽(29)
  • 如何保證數(shù)據(jù)庫、緩存的雙寫一致?

    在我們?nèi)粘Q邪l(fā)過程中,由于數(shù)據(jù)庫的一些限制,我們經(jīng)常使用緩存(如:Redis)來提升訪問速率。此時,數(shù)據(jù)庫和緩存雙寫數(shù)據(jù)就存在一致性問題,這個問題跟開發(fā)語言無關(guān),在高并發(fā)場景下,問題更加嚴重。 另外,在面試、工作中也會經(jīng)常遇到這個問題。所以這里跟大家

    2024年04月12日
    瀏覽(28)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包