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

解決Redis的緩存與數(shù)據(jù)庫雙寫不一致問題

 更新時間:2024年10月25日 14:25:41   作者:編程小菜吉  
在使用緩存和數(shù)據(jù)庫配合時,常見的CacheAsidePattern模式要求讀操作先訪問緩存,若缺失再讀數(shù)據(jù)庫并更新緩存;寫操作則是先寫數(shù)據(jù)庫后刪除緩存,但這種模式可能導(dǎo)致緩存與數(shù)據(jù)庫間的雙寫不一致問題

一、Cache Aside Pattern

在了解這個問題之前,我們有必要知道緩存+數(shù)據(jù)庫讀寫數(shù)據(jù)的模式,也就是Cache Aside Pattern

(1)讀的時候:先讀緩存,緩存沒有的話,就讀數(shù)據(jù)庫,然后取出數(shù)據(jù)后放入緩存,同時返回響應(yīng);

(2)寫的時候:先更新數(shù)據(jù)庫,然后再刪除緩存。 

寫的時候模式分析為什么是刪除緩存,而不是更新緩存?

①假設(shè)我們有10次寫,若是更新緩存的話需要更新10次緩存,10次數(shù)據(jù)庫,我們優(yōu)化為只需要刪除一次緩存,更新10次數(shù)據(jù)庫,當(dāng)有一個讀請求過來只是沒有命中,去數(shù)據(jù)庫讀取一下,這樣對性能的影響也不是很大;

②這是 一個 lazy 計算的思想,不要每次都重新做復(fù)雜的計算,不管它會不會用到,而是讓它到需要被使用的時候再重新計算。像mybatis,hibernate,都有懶加載思想。

二、緩存與數(shù)據(jù)庫雙寫不一致

1、雙寫不一致情況

線程1在寫數(shù)據(jù)庫與更新緩存之間卡頓了一下,然后線程2在線程1卡頓的這個空隙去寫了數(shù)據(jù)庫并刷新了緩存,然后線程2都已經(jīng)執(zhí)行完了,線程1又把臟數(shù)據(jù)更新到了緩存,造成了數(shù)據(jù)庫與緩存不一致。

2、讀寫并發(fā)不一致

先更新寫操作的,由于中間網(wǎng)絡(luò)問題或者什么問題造成更新數(shù)據(jù)推后,最后造成了臟數(shù)據(jù)的更新,導(dǎo)致數(shù)據(jù)庫與緩存雙寫不一致。

三、解決方案

(1)對于并發(fā)幾率很小的數(shù)據(jù)(如個人維度的訂單數(shù)據(jù)、用戶數(shù)據(jù)等),這種幾乎不用考慮這個問題,很少會發(fā)生緩存不一致,可以給緩存數(shù)據(jù)加上過期時間,每隔一段時間觸發(fā)讀的主動更新即可。

(2)就算并發(fā)很高,如果業(yè)務(wù)上能容忍短時間的緩存數(shù)據(jù)不一致(如商品名稱,商品分類菜單等),緩存加上過期時間依然可以解決大部分業(yè)務(wù)對于緩存的要求。

1、消息隊列串行化

(1)主要思路:在后臺進(jìn)程中我們可以創(chuàng)建多個隊列,然后根據(jù)hash算法將寫請求路由到不同的隊列中,當(dāng)來讀請求的時候,就加入隊列中,當(dāng)寫請求處理完畢后,再去處理讀請求。

(2)分析:如果對于同一份數(shù)據(jù)有多個寫請求同時在隊列中,那么來一個讀請求中加入隊列中之后,一般寫請求耗時比較久,那么讀請求會需要很久才能返回,這樣會特別影響性能,但能保證一致性(一般情況下建議不要用)

2、加分布式鎖

通過加分布式讀寫鎖保證并發(fā)讀寫寫寫的時候按順序排好隊讀讀的時候相當(dāng)于無鎖。

3、用阿里開源的canal

可以用阿里開源的canal通過監(jiān)聽數(shù)據(jù)庫的binlog日志及時的去修改緩存,但是引入了新的中間件,增加了系統(tǒng)的復(fù)雜度

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Redis實現(xiàn)數(shù)據(jù)的交集、并集、補(bǔ)集的示例

    Redis實現(xiàn)數(shù)據(jù)的交集、并集、補(bǔ)集的示例

    本文主要介紹了Redis實現(xiàn)數(shù)據(jù)的交集、并集、補(bǔ)集的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • redis和redisson實現(xiàn)分布式鎖的操作方法

    redis和redisson實現(xiàn)分布式鎖的操作方法

    使用 Redis 實現(xiàn)分布式鎖,最直接的想法是利用 setnx 和 expire 命令實現(xiàn)加鎖,這篇文章主要介紹了redis和redisson實現(xiàn)分布式鎖的操作方法,需要的朋友可以參考下
    2024-03-03
  • 如何解決緩存數(shù)據(jù)不一致性問題

    如何解決緩存數(shù)據(jù)不一致性問題

    文章主要討論了緩存和數(shù)據(jù)庫數(shù)據(jù)一致性的問題,包括數(shù)據(jù)不一致的原因、查詢和更新數(shù)據(jù)的邏輯、緩存雙刪方案以及優(yōu)化建議
    2025-01-01
  • redis列表類型_動力節(jié)點Java學(xué)院整理

    redis列表類型_動力節(jié)點Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了redis列表類型的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • redis+lua實現(xiàn)分布式限流的示例

    redis+lua實現(xiàn)分布式限流的示例

    本文主要介紹了redis+lua實現(xiàn)分布式限流的示例,可以實現(xiàn)復(fù)雜的限流邏輯,如滑動窗口限流,并且避免了多步操作導(dǎo)致的并發(fā)問題,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • Redis數(shù)據(jù)結(jié)構(gòu)之跳躍表使用學(xué)習(xí)

    Redis數(shù)據(jù)結(jié)構(gòu)之跳躍表使用學(xué)習(xí)

    這篇文章主要為大家介紹了Redis數(shù)據(jù)結(jié)構(gòu)之跳躍表使用學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 深度剖析Redis字符串操作指南從入門到實戰(zhàn)應(yīng)用

    深度剖析Redis字符串操作指南從入門到實戰(zhàn)應(yīng)用

    Redis字符串類型二進(jìn)制安全,支持文本、數(shù)字、二進(jìn)制等數(shù)據(jù),涵蓋基礎(chǔ)操作、數(shù)字計算、過期管理及分布式鎖等應(yīng)用,結(jié)合優(yōu)化策略提升系統(tǒng)性能,本文給大家介紹Redis字符串操作指南,感興趣的朋友一起看看吧
    2025-07-07
  • Redis的主從同步解析

    Redis的主從同步解析

    這篇文章主要介紹了Redis的主從同步解析,見識淺薄,僅供參考。
    2017-10-10
  • Redis 實現(xiàn)“附近的人”功能

    Redis 實現(xiàn)“附近的人”功能

    Redis基于geohash和有序集合提供了地理位置相關(guān)功能。這篇文章主要介紹了Redis 實現(xiàn)“附近的人”功能,需要的朋友可以參考下
    2019-11-11
  • Redis分布式鎖中8個常見面試題小結(jié)

    Redis分布式鎖中8個常見面試題小結(jié)

    本文主要介紹了Redis分布式鎖中8個常見面試題小結(jié),包括使用Redis、RedLock算法和ZooKeeper等工具,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03

最新評論

达孜县| 思茅市| 桓仁| 三穗县| 济南市| 山阳县| 鄂伦春自治旗| 松溪县| 三门峡市| 得荣县| 克拉玛依市| 太湖县| 高碑店市| 双城市| 英吉沙县| 伽师县| 江安县| 巴南区| 玛沁县| 光山县| 启东市| 尼勒克县| 祥云县| 南部县| 乐清市| 汉沽区| 定西市| 会昌县| 洪洞县| 大渡口区| 普兰店市| 秦安县| 法库县| 通道| 长汀县| 阿拉尔市| 利辛县| 尼玛县| 海兴县| 宜春市| 临朐县|