亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2023年04月13日 09:10:40   作者:愛吃糖的靚仔  
在實(shí)際開發(fā)過程中,緩存的使用頻率是非常高的,只要使用緩存和數(shù)據(jù)庫存儲,就難免會出現(xiàn)雙寫時(shí)數(shù)據(jù)一致性的問題,本文主要介紹了如何保證緩存和數(shù)據(jù)庫的數(shù)據(jù)一致性,需要的小伙伴可以參考閱讀

1、錯(cuò)誤的解決方案

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

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

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

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

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

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

若緩存更新成功數(shù)據(jù)庫更新失敗, 則此后讀到的都是未持久化的數(shù)據(jù)。因?yàn)榫彺嬷械臄?shù)據(jù)是易失的,這種狀態(tài)非常危險(xiǎn)。

2、正確的解決方案

2.1、使用 CAS

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

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

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

2.2、使用分布式鎖

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

還是以「先更新數(shù)據(jù)庫,再更新緩存」方案中兩個(gè)寫線程競爭為例, 我們要求任何線程在寫入或讀取數(shù)據(jù)庫前都需要獲取排它鎖。

分布式鎖同樣可以解決并發(fā)問題,只是成本可能略高。

2.3、使用消息隊(duì)列異步更新

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

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

  • 當(dāng)商品信息發(fā)生變化時(shí),需要更新緩存中的數(shù)據(jù)。這時(shí)可以通過消息隊(duì)列異步更新緩存,具體步驟如下:
  • 當(dāng)商品信息發(fā)生變化時(shí),先更新數(shù)據(jù)庫中的數(shù)據(jù)。
  • 將商品信息更新請求發(fā)送到消息隊(duì)列中。
  • 消息隊(duì)列異步地處理緩存更新操作,讀取最新的商品信息,并將其更新到緩存中。

這樣就可以保證緩存中的數(shù)據(jù)是最新的,避免了因?yàn)榫彺嬷械臄?shù)據(jù)過期而導(dǎo)致的數(shù)據(jù)不一致問題。同時(shí),使用消息隊(duì)列可以提高更新的可靠性和性能,避免因?yàn)榫彺娓率《鴮?dǎo)致的數(shù)據(jù)庫和緩存數(shù)據(jù)不一致問題。

為什么異步更新可以解決

  • 異步更新緩存:當(dāng)商品信息發(fā)生變化時(shí),先更新數(shù)據(jù)庫中的數(shù)據(jù),然后將緩存更新請求發(fā)送到消息隊(duì)列中,由消息隊(duì)列異步地處理緩存更新操作。這樣,即使緩存更新失敗,也不會影響數(shù)據(jù)庫中的數(shù)據(jù),僅僅是緩存中的數(shù)據(jù)不是最新的而已。
  • 消息隊(duì)列的可靠性:消息隊(duì)列通常具有高可靠性和高可用性,可以保證消息的可靠傳輸和處理。即使在消息隊(duì)列出現(xiàn)故障的情況下,也可以通過消息隊(duì)列的備份、重試等機(jī)制來保證消息的可靠性。因此,即使緩存更新失敗,也可以通過重試等機(jī)制來保證緩存最終被更新。

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

  • 重試更新緩存:當(dāng)緩存更新失敗時(shí),可以嘗試重新更新緩存??梢栽O(shè)置重試次數(shù)和重試間隔時(shí)間,避免因?yàn)轭l繁重試而影響性能。
  • 回滾數(shù)據(jù)庫更新:當(dāng)緩存更新失敗時(shí),可以回滾數(shù)據(jù)庫中的更新操作,保證數(shù)據(jù)庫和緩存中的數(shù)據(jù)一致。但是,回滾操作可能會影響數(shù)據(jù)庫中的其他操作,需要考慮到這個(gè)問題。
  • 延遲更新緩存:當(dāng)緩存更新失敗時(shí),可以將緩存更新請求放入一個(gè)延遲隊(duì)列中,一段時(shí)間后再次嘗試更新緩存。這樣可以避免頻繁重試而影響性能,同時(shí)保證緩存最終被更新。
  • 使用讀寫分離:將讀請求和寫請求分別處理,讀請求從緩存中讀取數(shù)據(jù),寫請求先更新數(shù)據(jù)庫,再更新緩存。這樣可以避免因?yàn)榫彺娓率《鴮?dǎo)致的數(shù)據(jù)不一致問題。

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

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

  • 要將MySQL和Redis放入同一個(gè)事務(wù)中,需要使用分布式事務(wù)處理框架,如XA或TCC。這些框架可以確保在整個(gè)事務(wù)過程中,MySQL和Redis的操作都能夠得到正確的協(xié)調(diào)和同步。
  • XA:XA是一種分布式事務(wù)處理標(biāo)準(zhǔn),它可以確保在多個(gè)數(shù)據(jù)庫之間進(jìn)行事務(wù)處理時(shí),所有的操作都能夠得到正確的協(xié)調(diào)和同步。在MySQL和Redis中都有XA實(shí)現(xiàn),可以通過XA接口實(shí)現(xiàn)分布式事務(wù)。
  • TCC:TCC是一種補(bǔ)償性事務(wù)處理框架,它通過預(yù)留資源、確認(rèn)資源和釋放資源三個(gè)步驟來實(shí)現(xiàn)分布式事務(wù)。在MySQL和Redis中都有TCC實(shí)現(xiàn),可以通過TCC接口實(shí)現(xiàn)分布式事務(wù)。
  • 需要注意的是,使用分布式事務(wù)框架會增加系統(tǒng)的復(fù)雜性和開銷,需要仔細(xì)考慮是否真正需要在MySQL和Redis之間實(shí)現(xiàn)分布式事務(wù)如果可以接受稍微降低一些數(shù)據(jù)一致性的風(fēng)險(xiǎn),可以使用其他技術(shù)來實(shí)現(xiàn)MySQL和Redis之間的數(shù)據(jù)同步,如消息隊(duì)列、定時(shí)任務(wù)等。

到此這篇關(guān)于保證緩存和數(shù)據(jù)庫的數(shù)據(jù)一致性詳解的文章就介紹到這了,更多相關(guān)緩存和數(shù)據(jù)庫數(shù)據(jù)一致性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Servlet第一個(gè)項(xiàng)目的發(fā)布(入門)

    Servlet第一個(gè)項(xiàng)目的發(fā)布(入門)

    這篇文章主要介紹了Servlet第一個(gè)項(xiàng)目的發(fā)布,下面是用servlet實(shí)現(xiàn)的一個(gè)簡單的web項(xiàng)目,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2021-04-04
  • Java8新特性之重復(fù)注解(repeating annotations)淺析

    Java8新特性之重復(fù)注解(repeating annotations)淺析

    這篇文章主要介紹了Java8新特性之重復(fù)注解(repeating annotations)淺析,這個(gè)新特性只是修改了程序的可讀性,是比較小的一個(gè)改動(dòng),需要的朋友可以參考下
    2014-06-06
  • Spring中的FactoryBean與BeanFactory詳細(xì)解析

    Spring中的FactoryBean與BeanFactory詳細(xì)解析

    這篇文章主要介紹了Spring中的FactoryBean與BeanFactory詳細(xì)解析,在Spring框架中,FactoryBean和BeanFactory是兩個(gè)關(guān)鍵的接口,用于創(chuàng)建和管理對象實(shí)例,它們在Spring的IoC(Inversion of Control,控制反轉(zhuǎn))容器中發(fā)揮著重要的作用,需要的朋友可以參考下
    2023-11-11
  • java接口用戶上下文的設(shè)計(jì)與實(shí)現(xiàn)

    java接口用戶上下文的設(shè)計(jì)與實(shí)現(xiàn)

    這篇文章主要為大家介紹了接口用戶上下文的設(shè)計(jì)與實(shí)現(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Java中可以實(shí)現(xiàn)負(fù)載均衡的算法詳解

    Java中可以實(shí)現(xiàn)負(fù)載均衡的算法詳解

    這篇文章主要介紹了Java中可以實(shí)現(xiàn)負(fù)載均衡的算法詳解,在Java中,有多種算法可以實(shí)現(xiàn)負(fù)載均衡,下面是兩個(gè)常見的算法示例,隨機(jī)算法和輪詢算法,需要的朋友可以參考下
    2023-08-08
  • Java1.7全網(wǎng)最深入HashMap源碼解析

    Java1.7全網(wǎng)最深入HashMap源碼解析

    HashMap 是一個(gè)散列表,它存儲的內(nèi)容是鍵值對(key-value)映射。HashMap 實(shí)現(xiàn)了 Map 接口,根據(jù)鍵的 HashCode 值存儲數(shù)據(jù),具有很快的訪問速度,最多允許一條記錄的鍵為 nul
    2021-11-11
  • 全面解讀Java?NIO(看這篇就夠了)

    全面解讀Java?NIO(看這篇就夠了)

    Java?NIO是Java1.4之后推出來的一套IO接口,NIO提供了一種完全不同的操作方式,?NIO支持面向緩沖區(qū)的、基于通道的IO操作,這篇文章主要介紹了Java?NIO詳解(看這篇就夠了),需要的朋友可以參考下
    2023-05-05
  • idea?compile項(xiàng)目正常啟動(dòng)項(xiàng)目的時(shí)候build失敗報(bào)“找不到符號”等問題及解決方案

    idea?compile項(xiàng)目正常啟動(dòng)項(xiàng)目的時(shí)候build失敗報(bào)“找不到符號”等問題及解決方案

    這篇文章主要介紹了idea?compile項(xiàng)目正常,啟動(dòng)項(xiàng)目的時(shí)候build失敗,報(bào)“找不到符號”等問題,這種問題屬于lombok編譯失敗導(dǎo)致,可能原因是依賴jar包沒有更新到最新版本,需要的朋友可以參考下
    2023-10-10
  • java中的BlockingQueue(阻塞隊(duì)列)解析

    java中的BlockingQueue(阻塞隊(duì)列)解析

    這篇文章主要介紹了java中的BlockingQueue阻塞隊(duì)列解析,阻塞隊(duì)列是一個(gè)支持兩個(gè)附加操作的隊(duì)列,這兩個(gè)附加的操作是,在隊(duì)列為空時(shí),獲取元素的線程會等待隊(duì)列變?yōu)榉强?需要的朋友可以參考下
    2023-12-12
  • Spring?Cloud?Alibaba實(shí)現(xiàn)服務(wù)的無損下線功能(案例講解)

    Spring?Cloud?Alibaba實(shí)現(xiàn)服務(wù)的無損下線功能(案例講解)

    這篇文章主要介紹了Spring?Cloud?Alibaba實(shí)現(xiàn)服務(wù)的無損下線功能?,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03

最新評論