最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis 緩存雙寫一致性的解決方案

 更新時間:2025年02月28日 10:06:57   作者:為什么要做囚徒  
本文主要介紹了Redis 緩存雙寫一致性的解決方案,包括CacheAsidePattern、ReadThrough/WriteThrough和WriteBehind三種模式,具有一定的參考價值,感興趣的可以了解一下

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

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

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

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

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

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

那為什么要先更新數(shù)據(jù)庫在刪除緩存了?我們再看看幾種更新策略

策略是否是多線程場景現(xiàn)象
先刪除緩存再更新數(shù)據(jù)庫刪除緩存成功但數(shù)據(jù)庫更新失敗應(yīng)用程序從數(shù)據(jù)庫中讀到舊值
緩存刪除成功但數(shù)據(jù)庫再更新中…有并發(fā)讀請求并發(fā)讀請求從數(shù)據(jù)庫讀到舊值,并回寫到redis,導(dǎo)致后續(xù)都從redis讀取到舊值
先更新數(shù)據(jù)庫再刪除緩存數(shù)據(jù)庫更新成功,但緩存刪除失敗應(yīng)用程序從redis讀取到舊值
數(shù)據(jù)庫更新成功,但緩存再刪除中…有并發(fā)讀請求并發(fā)讀請求讀取到舊值
先更新緩存再更新數(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ā)讀請求并發(fā)讀請求讀取到舊值

延遲雙刪

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

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

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

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

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

  • 延遲刪除具體需要延遲多長時間?

對于這個具體需要延遲多長時間,其實沒有絕對的標(biāo)準,唯一的標(biāo)準就是根據(jù)讀請求的耗時來確定,讀請求越耗時,延遲時間越長。一般情況下我們設(shè)置的延遲時間為1秒。

重試刪除

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

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

binlog訂閱異步刪除

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

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

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

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

使用場景

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

2.3 Write Behind(后寫或異步寫)

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

使用場景

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

3. 總結(jié)

在使用Redis緩存時,應(yīng)根據(jù)具體的業(yè)務(wù)場景和需求選擇合適的緩存模式。Cache Aside模式簡單易用,適用于讀多寫少的場景;Read/Write Through模式完全解耦緩存和數(shù)據(jù)庫,適用于讀多寫多的場景;Write Behind Caching模式可以提高寫入性能,適用于寫多讀少的場景。在實際應(yīng)用中,可以根據(jù)具體的業(yè)務(wù)需求和性能要求,選擇合適的緩存模式,以提高系統(tǒng)的性能和穩(wěn)定性。

到此這篇關(guān)于Redis 緩存雙寫一致性的實現(xiàn)的文章就介紹到這了,更多相關(guān)Redis 緩存雙寫一致性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis緩沖區(qū)溢出及解決方案分享

    Redis緩沖區(qū)溢出及解決方案分享

    Redis緩沖區(qū)溢出是指Redis緩沖區(qū)被寫入的數(shù)據(jù)超過了它的容量,導(dǎo)致數(shù)據(jù)無法存儲或被覆蓋。造成緩沖區(qū)溢出的原因可能是快速寫入大量數(shù)據(jù)、緩沖區(qū)未及時刷新或Redis服務(wù)器配置不當(dāng)?shù)取?/div> 2023-04-04
  • Redis唯一ID生成器的實現(xiàn)

    Redis唯一ID生成器的實現(xiàn)

    本文主要介紹了Redis唯一ID生成器的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 詳談redis跟數(shù)據(jù)庫的數(shù)據(jù)同步問題

    詳談redis跟數(shù)據(jù)庫的數(shù)據(jù)同步問題

    文章討論了在Redis和數(shù)據(jù)庫數(shù)據(jù)一致性問題上的解決方案,主要比較了先更新Redis緩存再更新數(shù)據(jù)庫和先更新數(shù)據(jù)庫再更新Redis緩存兩種方案,文章指出,刪除Redis緩存后再更新數(shù)據(jù)庫的方案更優(yōu),因為它可以避免數(shù)據(jù)不一致的問題,但可能產(chǎn)生高并發(fā)問題
    2025-01-01
  • Redis 旁路緩存深度解析

    Redis 旁路緩存深度解析

    旁路緩存是 Redis 最常用的緩存策略,本文主要介紹了Redis旁路緩存深度解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-04-04
  • Redis生成全局唯一ID的實現(xiàn)方法

    Redis生成全局唯一ID的實現(xiàn)方法

    全局唯一ID生成器是一種在分布式系統(tǒng)下用來生成全局唯一ID的工具,本文主要介紹了Redis生成全局唯一ID的實現(xiàn)方法,具有一定的參考價值,感興趣的可以了解一下
    2022-06-06
  • redis中opsForList().range()的使用方法詳解

    redis中opsForList().range()的使用方法詳解

    這篇文章主要給大家介紹了關(guān)于redis中opsForList().range()的使用方法,文中通過實例代碼以及圖文介紹的非常詳細,對大家學(xué)習(xí)或者使用redis具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-03-03
  • Redis中List類型的常用命令

    Redis中List類型的常用命令

    本文主要介紹了Redis中List類型的常用命令,包含12種常用命令,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • Redis 基礎(chǔ)教程之事務(wù)的使用方法

    Redis 基礎(chǔ)教程之事務(wù)的使用方法

    這篇文章主要介紹了Redis 基礎(chǔ)教程之事務(wù)的使用方法的相關(guān)資料,Redis 事務(wù)可以一次執(zhí)行多個命令和保證,單獨的隔離操作和原子操作需要的朋友可以參考下
    2017-08-08
  • redis啟動失敗問題之完美解決方案

    redis啟動失敗問題之完美解決方案

    這篇文章主要介紹了redis啟動失敗問題之完美解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 詳解redis集群的三種方式

    詳解redis集群的三種方式

    Redis三種集群方式分別是主從復(fù)制,哨兵模式,Cluster集群,這篇文章主要介紹了redis集群的三種方式,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2022-07-07

最新評論

长治市| 花莲市| 海口市| 若尔盖县| 哈巴河县| 政和县| 手机| 饶河县| 儋州市| 百色市| 措勤县| 车致| 宁夏| 元江| 古交市| 灵台县| 天水市| 沙河市| 绥德县| 绵阳市| 潜山县| 涟水县| 河北省| 电白县| 亳州市| 文安县| 永善县| 卢氏县| 瑞安市| 库伦旗| 恩平市| 安达市| 淳化县| 曲阜市| 英吉沙县| 梧州市| 岳西县| 钟山县| 临洮县| 盐山县| 巴彦淖尔市|