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

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

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

3天內不再提示

聊聊緩存數據庫一致性

OSC開源社區 ? 來源:又拍云 ? 2023-01-30 17:41 ? 次閱讀

在云服務中,緩存是極其重要的一點。所謂緩存,其實是一個高速數據存儲層。當緩存存在后,日后再次請求該數據就會直接訪問緩存,提升數據訪問的速度。

但是緩存存儲的數據通常是短暫性的,這就需要經常對緩存進行更新。而我們操作緩存和數據庫,分為讀操作和寫操作。

讀操作的詳細流程為,請求數據,如緩存中存在數據則直接讀取并返回,如不存在則從數據庫中讀取,成功之后將數據放到緩存中。 寫操作則又分為以下 4 種:

先更新緩存,再更新數據庫

先更新數據庫,再更新緩存

先刪除緩存,再更新數據庫

先更新數據庫,再刪除緩存

一些一致性要求不高的數據,如點贊數等,可以先更新緩存,然后再定時同步到數據庫。而在其它情況下,我們通常會等數據庫操作成功,再操作緩存。

下面主要介紹更新數據庫成功后,更新緩存和刪除緩存這兩個操作的區別和改進方案。

先更新數據庫,再刪除緩存

先更新數據庫,再刪除緩存,這種模式也叫 cache aside,是目前比較流行的處理緩存數據庫一致性的方法。它的優點是:

出現數據不一致的概率極低,實現簡單

由于不更新緩存,而是刪除緩存,在并發寫寫情況下,不會出現數據不一致的情況

出現數據不一致的情況出現在并發讀寫的場景下,詳情可見下圖:

23dc4722-9693-11ed-bfe3-dac502259ad0.png

這種情況發生的概率比較低,必須要在某?時間區間同時存在兩個或多個寫?和多個讀取,所以大部分業務都容忍了這種小概率的不一致。

雖然發生的概率較低,但還是有一些方案可以讓影響降到更低。

優化方案

第一種方案為:采用較短的過期時間來減少影響。這種方法有兩個缺點:

刪除后,讀請求會 miss

如果緩存不一致,不一致的時間取決于過期時間設置

第二種方案則是采用延遲雙刪的策略,比如:1分鐘以后刪除緩存。這種做法也存在兩個缺點:

刪除緩存之前的時間里可能會有不一致

刪除后,讀請求會 miss

第三種方案為雙更新策略,思路與延遲雙刪策略差不多。不同的點是,此方案不刪除緩存而是更新緩存,所以讀請求就不會發生 miss。但是另一個缺點還是存在。

先更新數據庫,再更新緩存

相比先更新數據庫再刪除緩存的操作,先更新數據庫再更新緩存的操作可以避免用戶請求直接打到數據庫,進而導致緩存穿透的問題。

此方案是更新緩存,我們需要關注并發讀寫和并發寫寫兩個場景下導致的數據不一致。 先來看看并發讀寫的情況,步驟如下圖所示:

24079c92-9693-11ed-bfe3-dac502259ad0.png

可以看到由于 4 和 5 操作步驟都設置了緩存,如果步驟4發生在步驟5之前,那么會出現舊值覆蓋新值的情況,也就是緩存不一致的情況。這種情況只需要修改一下步驟5,便可解決。

優化方案

可以通過在第五步不要 set cache,改用 add cache,redis 中使用 setnx 命令來進行優化。修改后步驟示意圖如下:

243f9eb2-9693-11ed-bfe3-dac502259ad0.png

解決完了并發讀寫場景導致的數據不一致,再來看看并發寫寫情況導致的數據不一致問題。

出現不一致的情況如下圖所示,Thread A 比 Thread B 先更新完 DB,但是 Thread B 卻先更新完緩存,這就導致緩存會被 Thread A 的舊值所覆蓋。

24715f60-9693-11ed-bfe3-dac502259ad0.png

這種情況也是有方法可以優化的,下面介紹兩個主流方法:

使用分布式鎖

使用版本號

使用分布式鎖

要解決并發讀寫的問題,第一個思路就是消滅并發寫。而使用分布式鎖,讓寫操作排隊執行,理論上就可以解決并發寫的問題,但現在并沒有可靠的分布式鎖實現方案。

2489593a-9693-11ed-bfe3-dac502259ad0.png

不管是基于 Zookeeper,etcd 還是 redis 實現分布式鎖,為了防止程序掛掉而鎖不能釋放,我們都會給鎖設置租約/過期時間,想象一種場景:如果進程卡頓幾分鐘(雖然概率較低),導致鎖失效,而其它線程獲取到鎖,此時就又出現了并發讀寫的場景了,還是有可能會造成數據不一致。

使用版本號

并發寫導致的數據不一致,是因為低版本覆蓋了高版本。那么我們可以想辦法不讓這種情況發生,一種可行的方案是引入版本號,如果寫入的數據低于現版本號,則放棄覆蓋。 缺點:

應用層維護版本的代價很大,大規模落地很難

需修改數據模型,添加版本

每次需要修改,讓版本自增

不管是更新緩存還是刪除緩存,優化以后都將出現數據不一致的概率降到最低了。但是有沒有一種辦法既簡單,又不會出現數據不一致的場景呢。下面就介紹一下 Rockscache。

Rockscache

簡介

Rockscache 也是一種保持緩存一致性的方法,它采用的緩存管理策略是:更新數據庫后,將緩存標記為刪除。主要通過以下兩個方法來實現:

Fetch 函數實現了前面的查詢緩存

TagAsDeleted 函數實現了標記刪除的邏輯

在運行時只要讀數據時調用 Fetch,并且確保更新數據庫之后調用 TagAsDeleted,就能夠確保緩存最終一致。這一策略有 4 個特點:

不需要引入版本,幾乎可以適用于所有緩存場景

架構上與"更新 DB 后刪除緩存”一樣,無額外負擔

性能高:變化只是將原來的 GET/SET/DELETE,替換為 Lua 腳本

強一致方案的性能也很高,與普通的防緩存擊穿方案一樣

在 Rockscache 策略中,緩存中的數據是包含幾個字段的 hash:

value:數據本身

lockUtil:數據鎖定到期時間,當某個進程查詢緩存無數據,那么先鎖定緩存一小段時間,然后查詢 DB,然后更新緩存

owner:數據鎖定者 uuid

證明

因為 Rockscache 方案并不更新緩存,所以只要確保并發讀寫數據一致性即可。

下面來看看 Rockscache 是怎么解決數據不一致的問題,先回憶一遍 cache aside 模式導致的數據不一致的原因 結合 cache aside 模式出現數據不一致的場景,來講講 Rockscache 是怎么解決的。

23dc4722-9693-11ed-bfe3-dac502259ad0.png

我們要解決的核心問題是,防止舊值寫入到緩存中。Rockscache 的解決方案是這樣的:

查詢請求,如果緩存中讀不到數據,還要做一個操作:鎖定緩存,為key設置一個uuid

寫請求在刪除緩存的時候,需要把鎖刪了

讀請求在設置緩存的時候,通過uuid比對,發現上鎖的不是自己,說明有寫請求把數據更新了,則放棄修改緩存

至此我們已經完成了 rockscache 策略下的緩存更新。不過和其他緩存更新策略一樣,我們都默認操作數據庫成功后,操作緩存肯定成功。

但是這是不對的,在實際操作過程即便操作數據庫成功,也可能出現緩存操作失敗的情況,因此可以通過以下 3 種方式來保證緩存更新成功:

本地消息表

監聽 binlog

dtm 的二階段消息

除了緩存更新,Rockscache 還有以下兩種功能:

防止緩存擊穿

防止防止穿透和緩存雪崩

這都是非常實用的功能,推薦大家實際使用操作試試看。






審核編輯:劉清

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

    關注

    0

    文章

    22

    瀏覽量

    8198
  • Hash算法
    +關注

    關注

    0

    文章

    43

    瀏覽量

    7450
  • Lua
    Lua
    +關注

    關注

    0

    文章

    81

    瀏覽量

    10648
  • cache技術
    +關注

    關注

    0

    文章

    41

    瀏覽量

    1118

原文標題:從實戰出發,聊聊緩存數據庫一致性

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何解決數據庫緩存一致性

    緩存一致性 每次逢年過節的時候搶票非常艱難,放票的時候那么多人同時去搶票,如果所有人查詢、購票等都去訪問數據庫,那數據庫的壓力得有多大,這時候很多都會引入
    的頭像 發表于 09-25 15:25 ?1215次閱讀
    如何解決<b class='flag-5'>數據庫</b>與<b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>

    理解數據庫的事務:ACID,CAP和一致性

    理解數據庫的事務,ACID,CAP和一致性
    發表于 05-04 16:25

    Cache一致性協議優化研究

    問題的由來.總結了多核時代高速緩存一致性協議設計的關鍵問題,綜述了近年來學術界對一致性的研究.從程序訪存行為模式、目錄組織結構、一致性粒度、一致性
    發表于 12-30 15:04 ?0次下載
    Cache<b class='flag-5'>一致性</b>協議優化研究

    分布式大數據一致性檢測

    關系數據庫中可能存在數據一致性現象,關系數據庫數據質量的個主要問題是存在違反函數依賴情況,為
    發表于 01-12 16:29 ?0次下載

    自主駕駛系統將使用緩存一致性互連IP和非一致性互連IP

    代ASIL B(D)自主駕駛系統將使用符合ISO 26262標準的緩存一致性互連IP和非一致性互連IP來實現。 美國加利福尼亞州坎貝爾2019年4月26日消息—Arteris IP
    的頭像 發表于 05-09 17:13 ?3328次閱讀

    管理基于Cortex?-M7的MCU的高速緩存一致性

    本文檔概述了不同場景下的高速緩存一致性問題,并就如何管理或避免高速緩存一致性問題提供了些方法建議。
    發表于 04-01 10:12 ?5次下載
    管理基于Cortex?-M7的MCU的高速<b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>

    Redis緩存更新一致性的方式

    當執行寫操作后,需要保證從緩存讀取到的數據數據庫中持久化的數據一致的,因此需要對緩存進行更新
    的頭像 發表于 11-21 10:40 ?843次閱讀

    緩存數據庫一致性問題如何解決

    最近不是正好在研究 canal 嘛,剛巧前兩天看了篇關于解決緩存數據庫一致性問題的文章,里邊提到了種解決方案是結合 canal 來操作
    的頭像 發表于 03-24 14:34 ?733次閱讀
    <b class='flag-5'>緩存</b>與<b class='flag-5'>數據庫</b><b class='flag-5'>一致性</b>問題如何解決

    異構數據庫排序一致性填坑教程

    不同數據庫對于字符值的排序規則各不相同,要達成在不同數據庫上對于同樣數據集執行查詢語句的輸出結果順序一致性目標,則必須進行相應的設置或改寫,本文通過對五種
    的頭像 發表于 03-29 13:43 ?1069次閱讀
    異構<b class='flag-5'>數據庫</b>排序<b class='flag-5'>一致性</b>填坑教程

    緩存數據庫雙寫一致性幾種策略分析

    在高并發場景中,為防止大量請求直接訪問數據庫,緩解數據庫壓力,常用的方式般會增加緩存層起到緩沖作用,減少數據庫壓力。
    的頭像 發表于 04-21 10:27 ?761次閱讀

    虹科干貨 | 什么是數據庫一致性

    數據庫一致性(database consistency)由組值定義,數據庫系統中的所有數據點都必須與這些值保持
    的頭像 發表于 07-13 13:56 ?730次閱讀
    虹科干貨 | 什么是<b class='flag-5'>數據庫</b><b class='flag-5'>一致性</b>?

    如何保證緩存一致性

    “ 本文的參考文章是2022年HOT 34上Intel Rob Blakenship關于CXL緩存一致性篇介紹。”
    的頭像 發表于 10-19 17:42 ?1338次閱讀
    如何保證<b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>

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

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

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

    深入理解數據備份的關鍵原則:應用一致性與崩潰一致性的區別 在數字化時代,數據備份成為了企業信息安全的核心環節。但在備份過程中,兩個關鍵概念——應用
    的頭像 發表于 03-11 11:29 ?1118次閱讀
    深入理解<b class='flag-5'>數據</b>備份的關鍵原則:應用<b class='flag-5'>一致性</b>與崩潰<b class='flag-5'>一致性</b>的區別

    異構計算下緩存一致性的重要

    在眾多回復中,李博杰同學的回答被認為質量最高。他首先將緩存一致性分為兩個主要場景:是主機內CPU與設備間的一致性;二是跨主機的一致性
    的頭像 發表于 10-24 17:00 ?967次閱讀
    異構計算下<b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>的重要<b class='flag-5'>性</b>
    主站蜘蛛池模板: 厕所RXXX | 国产精品久久久久秋霞影视 | 亚洲一级电影 | 男女生爽爽爽视频免费观看 | 日日干夜夜啪蕉视频 | 呜呜别塞了啊抽插 | 久久视频精品38线视频在线观看 | 精品水蜜桃久久久久久久 | 国产WW久久久久久久久久 | 精品视频在线观看视频免费视频 | 午夜DV内射一区区 | 国产露脸无码A区久久 | 久久精品视频uu | 国产老师开裆丝袜喷水漫画 | 色老板美国在线观看 | 中文字幕一区中文亚洲 | 丝袜美女被啪啪不带套漫画 | 亚洲精品国产在线网站 | 国产成人在线观看网站 | 精品高潮呻吟99AV无码 | 国产成人免费 | 国产成人免费高清激情视频 | 久久精品无码成人国产毛 | 中文字幕人成人乱码亚洲影视 | 国精产品一区二区三区有限公司 | 91女神娇喘| 国产午夜在线视频 | 国产亚洲精品久久久久久久软件 | 在线观看免费视频a | 人与禽物videos另类 | 国产亚洲国际精品福利 | 一级特黄视频 | 热久久国产欧美一区二区精品 | 天天摸夜添狠狠添高 | 欧美日韩一区在线观看 | voyeurhit农村夫妻偷拍 | 欧洲电影巜肉欲丛林 | 补课H湿 1V1 PLAY | 狼群资源网中文字幕 | 96.8在线收听 | 亚洲国产成人精品不卡青青草原 |