色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何保障MySQL和Redis的數據一致性

Linux愛好者 ? 來源:Linux愛好者 ? 2023-03-14 16:48 ? 次閱讀

我直接先拋一下結論:在滿足實時性的條件下,不存在兩者完全保存一致的方案,只有最終一致性方案。根據網上的眾多解決方案,總結出 6 種,直接看目錄:

a0f40be6-c23a-11ed-bfe3-dac502259ad0.png

不好的方案

1. 先寫 MySQL,再寫 Redis

a114271e-c23a-11ed-bfe3-dac502259ad0.png

圖解說明:

這是一副時序圖,描述請求的先后調用順序;

橘黃色的線是請求 A,黑色的線是請求 B;

橘黃色的文字,是 MySQL 和 Redis 最終不一致的數據;

數據是從 10 更新為 11;

后面所有的圖,都是這個含義,不再贅述。

請求 A、B 都是先寫 MySQL,然后再寫 Redis,在高并發情況下,如果請求 A 在寫 Redis 時卡了一會,請求 B 已經依次完成數據的更新,就會出現圖中的問題。

這個圖已經畫的很清晰了,我就不用再去啰嗦了吧,不過這里有個前提,就是對于讀請求,先去讀 Redis,如果沒有,再去讀 DB,但是讀請求不會再回寫 Redis。大白話說一下,就是讀請求不會更新 Redis。

2. 先寫 Redis,再寫 MySQL

a12d47a8-c23a-11ed-bfe3-dac502259ad0.png

同“先寫 MySQL,再寫 Redis”,看圖可秒懂。

3. 先刪除 Redis,再寫 MySQL

這幅圖和上面有些不一樣,前面的請求 A 和 B 都是更新請求,這里的請求 A 是更新請求,但是請求 B 是讀請求,且請求 B 的讀請求會回寫 Redis。

a13a6500-c23a-11ed-bfe3-dac502259ad0.png

請求 A 先刪除緩存,可能因為卡頓,數據一直沒有更新到 MySQL,導致兩者數據不一致。

這種情況出現的概率比較大,因為請求 A 更新 MySQL 可能耗時會比較長,而請求 B 的前兩步都是查詢,會非常快。

好的方案

4. 先刪除 Redis,再寫 MySQL,再刪除 Redis

對于“先刪除 Redis,再寫 MySQL”,如果要解決最后的不一致問題,其實再對 Redis 重新刪除即可,這個也是大家常說的“緩存雙刪”。

a1534084-c23a-11ed-bfe3-dac502259ad0.png

為了便于大家看圖,對于藍色的文字,“刪除緩存 10”必須在“回寫緩存10”后面,那如何才能保證一定是在后面呢?網上給出的第一個方案是,讓請求 A 的最后一次刪除,等待 500ms。

對于這種方案,看看就行,反正我是不會用,太 Low 了,風險也不可控。

那有沒有更好的方案呢,我建議異步串行化刪除,即刪除請求入隊列

a1737ae8-c23a-11ed-bfe3-dac502259ad0.png

異步刪除對線上業務無影響,串行化處理保障并發情況下正確刪除。

如果雙刪失敗怎么辦,網上有給 Redis 加一個緩存過期時間的方案,這個不敢茍同。個人建議整個重試機制,可以借助消息隊列的重試機制,也可以自己整個表,記錄重試次數,方法很多。

簡單小結一下:

“緩存雙刪”不要用無腦的 sleep 500 ms;

通過消息隊列的異步&串行,實現最后一次緩存刪除;

緩存刪除失敗,增加重試機制。

5. 先寫 MySQL,再刪除 Redis

a17d1878-c23a-11ed-bfe3-dac502259ad0.png

對于上面這種情況,對于第一次查詢,請求 B 查詢的數據是 10,但是 MySQL 的數據是 11,只存在這一次不一致的情況,對于不是強一致性要求的業務,可以容忍。(那什么情況下不能容忍呢,比如秒殺業務、庫存服務等。)

當請求 B 進行第二次查詢時,因為沒有命中 Redis,會重新查一次 DB,然后再回寫到 Reids。

a1aec828-c23a-11ed-bfe3-dac502259ad0.png

這里需要滿足 2 個條件:

緩存剛好自動失效;

請求 B 從數據庫查出 10,回寫緩存的耗時,比請求 A 寫數據庫,并且刪除緩存的還長。

對于第二個條件,我們都知道更新 DB 肯定比查詢耗時要長,所以出現這個情況的概率很小,同時滿足上述條件的情況更小。

6. 先寫 MySQL,通過 Binlog,異步更新 Redis

這種方案,主要是監聽 MySQL 的 Binlog,然后通過異步的方式,將數據更新到 Redis,這種方案有個前提,查詢的請求,不會回寫 Redis。

a1d5bc94-c23a-11ed-bfe3-dac502259ad0.png

這個方案,會保證 MySQL 和 Redis 的最終一致性,但是如果中途請求 B 需要查詢數據,如果緩存無數據,就直接查 DB;如果緩存有數據,查詢的數據也會存在不一致的情況。

所以這個方案,是實現最終一致性的終極解決方案,但是不能保證實時性。

幾種方案比較

我們對比上面討論的 6 種方案:

先寫 Redis,再寫 MySQL

這種方案,我肯定不會用,萬一 DB 掛了,你把數據寫到緩存,DB 無數據,這個是災難性的;

我之前也見同學這么用過,如果寫 DB 失敗,對 Redis 進行逆操作,那如果逆操作失敗呢,是不是還要搞個重試?

先寫 MySQL,再寫 Redis

對于并發量、一致性要求不高的項目,很多就是這么用的,我之前也經常這么搞,但是不建議這么做;

當 Redis 瞬間不可用的情況,需要報警出來,然后線下處理。

先刪除 Redis,再寫 MySQL

這種方式,我還真沒用過,直接忽略吧。

先刪除 Redis,再寫 MySQL,再刪除 Redis

這種方式雖然可行,但是感覺好復雜,還要搞個消息隊列去異步刪除 Redis。

先寫 MySQL,再刪除 Redis

比較推薦這種方式,刪除 Redis 如果失敗,可以再多重試幾次,否則報警出來;

這個方案,是實時性中最好的方案,在一些高并發場景中,推薦這種。

先寫 MySQL,通過 Binlog,異步更新 Redis

對于異地容災、數據匯總等,建議會用這種方式,比如 binlog + kafka,數據的一致性也可以達到秒級;

純粹的高并發場景,不建議用這種方案,比如搶購、秒殺等。

個人結論:

實時一致性方案:采用“先寫 MySQL,再刪除 Redis”的策略,這種情況雖然也會存在兩者不一致,但是需要滿足的條件有點苛刻,所以是滿足實時性條件下,能盡量滿足一致性的最優解。

最終一致性方案:采用“先寫 MySQL,通過 Binlog,異步更新 Redis”,可以通過 Binlog,結合消息隊列異步更新 Redis,是最終一致性的最優解。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7224

    瀏覽量

    90197
  • 緩存
    +關注

    關注

    1

    文章

    243

    瀏覽量

    26829
  • MySQL
    +關注

    關注

    1

    文章

    836

    瀏覽量

    26950
  • Redis
    +關注

    關注

    0

    文章

    380

    瀏覽量

    11068

原文標題:幾種方案比較

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    串行數據一致性測試和驗證測量基礎知識

    小弟這次給大家帶來了串行數據一致性測試和驗證測量基礎知識其中提到了些高速串行信號的測試測量方法和簡單的原理性介紹,適合初學者使用。PS。這其中提到的些測量設備現在已經升級為最新的儀器設備,但是測試的原理和技術還是可以讓大家閑
    發表于 04-16 16:17

    Redis緩存和MySQL數據一致原因和解決方案

    高并發架構系列:Redis緩存和MySQL數據一致性方案詳解
    發表于 03-27 15:55

    一致性非鎖定讀分析

    MySQL探秘(六)InnoDB一致性非鎖定讀
    發表于 09-17 08:39

    如何解決stm32 H7 DMA串口發送數據一致性問題?

    如何解決stm32 H7 DMA串口發送數據一致性問題?
    發表于 12-06 06:05

    VxWorks中主備數據一致性功能組件的設計與實現

    數據一致性是主備用系統必須解決的問題。目前主備系統的一致性都采用手工編程來實現。導致代碼結構繁雜,且效率不高。利用VxWorks的異常處理機制,結合RISC CPU的特性.設
    發表于 12-16 14:21 ?5次下載

    VxWorks中主備數據一致性功能組件的設計與實現

    數據一致性是主備用系統必須解決的問題。目前主備系統的一致性都采用手工編程來實現,導致代碼結構繁雜,且效率不高。利用VxWorks 的異常處理機制,結合RISC CPU 的特性,設計實
    發表于 09-22 11:32 ?8次下載

    VxWorks中主備數據一致性功能組件的設計與實現

    數據一致性是主備用系統必須解決的問題。目前主備系統的一致性都采用手工編程來實現。導致代碼結構繁雜,且效率不高。利用VxWorks的異常處理機制,結合RISC CPU的特性.設計
    發表于 11-28 16:47 ?11次下載

    P2P平臺上的數據一致性研究

    P2P網絡是個自組織的動態網絡,對等點可以隨意的加入或者離開網絡,因此如何控制數據一致性成了P2P網絡平臺應用擴展應用的關鍵點,本文引入數據一致性算法到P2P網絡平臺中來,
    發表于 02-25 16:06 ?15次下載

    串行數據一致性及驗證基礎指南

    本基礎指南旨在幫助您了解串行數據傳輸的般方面,并介紹適用于這些新興串行技術的模擬和數字測量要求。 串行數據一致性測試和驗證測量基礎知識本手冊將幫助您理解串行
    發表于 08-05 15:14 ?32次下載

    電能質量監測數據一致性定義及檢測方法_邱麗羚

    電能質量監測數據一致性定義及檢測方法_邱麗羚
    發表于 01-08 11:07 ?0次下載

    分布式系統的CAP和數據一致性模型

    CAP理論的核心思想是任何基于網絡的數據共享系統最多只能滿足數據一致性(Consistency)、可用(Availability)和網絡分區容忍(Partition Tolerance)三個特性中的兩個。
    的頭像 發表于 05-05 23:20 ?2385次閱讀

    redismysql如何保持數據一致性

    RedisMySQL是兩個常用的數據庫系統,它們都有自己的特點和用途。在某些場景下,我們可能需要將RedisMySQL進行結合使用,并保
    的頭像 發表于 11-16 11:27 ?1021次閱讀

    Redis緩存與Mysql如何保證一致性

    基本流程就是客戶端A請求,先去刪除緩存,然后將數據寫入數據庫,此時客戶端B查詢先去查詢緩存,緩存沒有返回,去查數據庫,此時還沒有完成主從同步,拿到是從庫的舊數據,然后將舊
    的頭像 發表于 12-02 14:23 ?1023次閱讀
    <b class='flag-5'>Redis</b>緩存與<b class='flag-5'>Mysql</b>如何保證<b class='flag-5'>一致性</b>?

    redis集群中的hash一致性算法的理解

    Redis集群是種為了增強Redis的可擴展性和高可用而設計的集群方案。在Redis集群中,一致性
    的頭像 發表于 12-04 10:45 ?839次閱讀

    深入理解數據備份的關鍵原則:應用一致性與崩潰一致性的區別

    深入理解數據備份的關鍵原則:應用一致性與崩潰一致性的區別 在數字化時代,數據備份成為了企業信息安全的核心環節。但在備份過程中,兩個關鍵概念——應用
    的頭像 發表于 03-11 11:29 ?1119次閱讀
    深入理解<b class='flag-5'>數據</b>備份的關鍵原則:應用<b class='flag-5'>一致性</b>與崩潰<b class='flag-5'>一致性</b>的區別
    主站蜘蛛池模板: 亚洲AV综合色一区二区三区 | 成人影片下载网站 | 80岁色老头69av| 波多野结衣 熟女 | 超碰在线线公开免费视频 | 日日撸影院在线 | 99久久伊人一区二区yy5o99 | 亚洲精品午夜aaa级久久久久 | 亚洲AV午夜精品麻豆AV | 欧美日韩精品不卡在线观看 | 性欧美xxxxporn| 91女神娇喘 | 在线观看永久免费网址 | 国产精品视频国产永久视频 | 亚洲伊人精品 | 1313久久国产午夜精品理论片 | 色WWW永久免费视频首页 | 性色AV一区二区三区咪爱四虎 | 插骚妇好爽好骚 | 色即是空之甜性涩爱 | 肉小说高h | 亚洲第一页在线播放 | 亚洲AV无码影院在线播放 | 3d无遮挡h肉动漫在线播放 | 丝袜美女被啪啪不带套漫画 | 动漫美女性侵 | 强姧伦久久久久久久久 | 美女打开双腿扒开屁股男生 | 一道本av免费不卡播放 | 亚洲性夜色噜噜噜网站2258KK | 精子射到丝袜上图 | 免费人妻无码AV不卡在线 | 999久久精品国产 | 高清无码色大片中文 | 美女尿口羞羞视频 | 人妻免费久久久久久久了 | 久久国内精品视频 | 亚洲国产精品热久久 | 黄色大片aa| 青青草国产偷拍在线av | 99九九精品视频 |