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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

聊聊緩存數(shù)據(jù)庫一致性

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

在云服務(wù)中,緩存是極其重要的一點(diǎn)。所謂緩存,其實(shí)是一個(gè)高速數(shù)據(jù)存儲(chǔ)層。當(dāng)緩存存在后,日后再次請(qǐng)求該數(shù)據(jù)就會(huì)直接訪問緩存,提升數(shù)據(jù)訪問的速度。

但是緩存存儲(chǔ)的數(shù)據(jù)通常是短暫性的,這就需要經(jīng)常對(duì)緩存進(jìn)行更新。而我們操作緩存和數(shù)據(jù)庫,分為讀操作和寫操作。

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

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

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

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

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

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

下面主要介紹更新數(shù)據(jù)庫成功后,更新緩存和刪除緩存這兩個(gè)操作的區(qū)別和改進(jìn)方案。

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

先更新數(shù)據(jù)庫,再刪除緩存,這種模式也叫 cache aside,是目前比較流行的處理緩存數(shù)據(jù)庫一致性的方法。它的優(yōu)點(diǎn)是:

出現(xiàn)數(shù)據(jù)不一致的概率極低,實(shí)現(xiàn)簡單

由于不更新緩存,而是刪除緩存,在并發(fā)寫寫情況下,不會(huì)出現(xiàn)數(shù)據(jù)不一致的情況

出現(xiàn)數(shù)據(jù)不一致的情況出現(xiàn)在并發(fā)讀寫的場景下,詳情可見下圖:

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

這種情況發(fā)生的概率比較低,必須要在某?時(shí)間區(qū)間同時(shí)存在兩個(gè)或多個(gè)寫?和多個(gè)讀取,所以大部分業(yè)務(wù)都容忍了這種小概率的不一致。

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

優(yōu)化方案

第一種方案為:采用較短的過期時(shí)間來減少影響。這種方法有兩個(gè)缺點(diǎn):

刪除后,讀請(qǐng)求會(huì) miss

如果緩存不一致,不一致的時(shí)間取決于過期時(shí)間設(shè)置

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

刪除緩存之前的時(shí)間里可能會(huì)有不一致

刪除后,讀請(qǐng)求會(huì) miss

第三種方案為雙更新策略,思路與延遲雙刪策略差不多。不同的點(diǎn)是,此方案不刪除緩存而是更新緩存,所以讀請(qǐng)求就不會(huì)發(fā)生 miss。但是另一個(gè)缺點(diǎn)還是存在。

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

相比先更新數(shù)據(jù)庫再刪除緩存的操作,先更新數(shù)據(jù)庫再更新緩存的操作可以避免用戶請(qǐng)求直接打到數(shù)據(jù)庫,進(jìn)而導(dǎo)致緩存穿透的問題。

此方案是更新緩存,我們需要關(guān)注并發(fā)讀寫和并發(fā)寫寫兩個(gè)場景下導(dǎo)致的數(shù)據(jù)不一致。 先來看看并發(fā)讀寫的情況,步驟如下圖所示:

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

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

優(yōu)化方案

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

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

解決完了并發(fā)讀寫場景導(dǎo)致的數(shù)據(jù)不一致,再來看看并發(fā)寫寫情況導(dǎo)致的數(shù)據(jù)不一致問題。

出現(xiàn)不一致的情況如下圖所示,Thread A 比 Thread B 先更新完 DB,但是 Thread B 卻先更新完緩存,這就導(dǎo)致緩存會(huì)被 Thread A 的舊值所覆蓋。

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

這種情況也是有方法可以優(yōu)化的,下面介紹兩個(gè)主流方法:

使用分布式鎖

使用版本號(hào)

使用分布式鎖

要解決并發(fā)讀寫的問題,第一個(gè)思路就是消滅并發(fā)寫。而使用分布式鎖,讓寫操作排隊(duì)執(zhí)行,理論上就可以解決并發(fā)寫的問題,但現(xiàn)在并沒有可靠的分布式鎖實(shí)現(xiàn)方案。

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

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

使用版本號(hào)

并發(fā)寫導(dǎo)致的數(shù)據(jù)不一致,是因?yàn)榈桶姹靖采w了高版本。那么我們可以想辦法不讓這種情況發(fā)生,一種可行的方案是引入版本號(hào),如果寫入的數(shù)據(jù)低于現(xiàn)版本號(hào),則放棄覆蓋。 缺點(diǎn):

應(yīng)用層維護(hù)版本的代價(jià)很大,大規(guī)模落地很難

需修改數(shù)據(jù)模型,添加版本

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

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

Rockscache

簡介

Rockscache 也是一種保持緩存一致性的方法,它采用的緩存管理策略是:更新數(shù)據(jù)庫后,將緩存標(biāo)記為刪除。主要通過以下兩個(gè)方法來實(shí)現(xiàn):

Fetch 函數(shù)實(shí)現(xiàn)了前面的查詢緩存

TagAsDeleted 函數(shù)實(shí)現(xiàn)了標(biāo)記刪除的邏輯

在運(yùn)行時(shí)只要讀數(shù)據(jù)時(shí)調(diào)用 Fetch,并且確保更新數(shù)據(jù)庫之后調(diào)用 TagAsDeleted,就能夠確保緩存最終一致。這一策略有 4 個(gè)特點(diǎn):

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

架構(gòu)上與"更新 DB 后刪除緩存”一樣,無額外負(fù)擔(dān)

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

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

在 Rockscache 策略中,緩存中的數(shù)據(jù)是包含幾個(gè)字段的 hash:

value:數(shù)據(jù)本身

lockUtil:數(shù)據(jù)鎖定到期時(shí)間,當(dāng)某個(gè)進(jìn)程查詢緩存無數(shù)據(jù),那么先鎖定緩存一小段時(shí)間,然后查詢 DB,然后更新緩存

owner:數(shù)據(jù)鎖定者 uuid

證明

因?yàn)?Rockscache 方案并不更新緩存,所以只要確保并發(fā)讀寫數(shù)據(jù)一致性即可。

下面來看看 Rockscache 是怎么解決數(shù)據(jù)不一致的問題,先回憶一遍 cache aside 模式導(dǎo)致的數(shù)據(jù)不一致的原因 結(jié)合 cache aside 模式出現(xiàn)數(shù)據(jù)不一致的場景,來講講 Rockscache 是怎么解決的。

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

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

查詢請(qǐng)求,如果緩存中讀不到數(shù)據(jù),還要做一個(gè)操作:鎖定緩存,為key設(shè)置一個(gè)uuid

寫請(qǐng)求在刪除緩存的時(shí)候,需要把鎖刪了

讀請(qǐng)求在設(shè)置緩存的時(shí)候,通過uuid比對(duì),發(fā)現(xiàn)上鎖的不是自己,說明有寫請(qǐng)求把數(shù)據(jù)更新了,則放棄修改緩存

至此我們已經(jīng)完成了 rockscache 策略下的緩存更新。不過和其他緩存更新策略一樣,我們都默認(rèn)操作數(shù)據(jù)庫成功后,操作緩存肯定成功。

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

本地消息表

監(jiān)聽 binlog

dtm 的二階段消息

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

防止緩存擊穿

防止防止穿透和緩存雪崩

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






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • UUID
    +關(guān)注

    關(guān)注

    0

    文章

    22

    瀏覽量

    8125
  • Hash算法
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    7382
  • Lua
    Lua
    +關(guān)注

    關(guān)注

    0

    文章

    81

    瀏覽量

    10559
  • cache技術(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    41

    瀏覽量

    1064

原文標(biāo)題:從實(shí)戰(zhàn)出發(fā),聊聊緩存數(shù)據(jù)庫一致性

文章出處:【微信號(hào):OSC開源社區(qū),微信公眾號(hào):OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    理解數(shù)據(jù)庫的事務(wù):ACID,CAP和一致性

    理解數(shù)據(jù)庫的事務(wù),ACID,CAP和一致性
    發(fā)表于 05-04 16:25

    Cache一致性協(xié)議優(yōu)化研究

    問題的由來.總結(jié)了多核時(shí)代高速緩存一致性協(xié)議設(shè)計(jì)的關(guān)鍵問題,綜述了近年來學(xué)術(shù)界對(duì)一致性的研究.從程序訪存行為模式、目錄組織結(jié)構(gòu)、一致性粒度、一致性
    發(fā)表于 12-30 15:04 ?0次下載
    Cache<b class='flag-5'>一致性</b>協(xié)議優(yōu)化研究

    分布式大數(shù)據(jù)一致性檢測

    關(guān)系數(shù)據(jù)庫中可能存在數(shù)據(jù)一致性現(xiàn)象,關(guān)系數(shù)據(jù)庫數(shù)據(jù)質(zhì)量的個(gè)主要問題是存在違反函數(shù)依賴情況,為
    發(fā)表于 01-12 16:29 ?0次下載

    自主駕駛系統(tǒng)將使用緩存一致性互連IP和非一致性互連IP

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

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

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

    Redis緩存更新一致性的方式

    當(dāng)執(zhí)行寫操作后,需要保證從緩存讀取到的數(shù)據(jù)數(shù)據(jù)庫中持久化的數(shù)據(jù)一致的,因此需要對(duì)緩存進(jìn)行更新
    的頭像 發(fā)表于 11-21 10:40 ?758次閱讀

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

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

    異構(gòu)數(shù)據(jù)庫排序一致性填坑教程

    不同數(shù)據(jù)庫對(duì)于字符值的排序規(guī)則各不相同,要達(dá)成在不同數(shù)據(jù)庫上對(duì)于同樣數(shù)據(jù)集執(zhí)行查詢語句的輸出結(jié)果順序一致性目標(biāo),則必須進(jìn)行相應(yīng)的設(shè)置或改寫,本文通過對(duì)五種
    的頭像 發(fā)表于 03-29 13:43 ?963次閱讀
    異構(gòu)<b class='flag-5'>數(shù)據(jù)庫</b>排序<b class='flag-5'>一致性</b>填坑教程

    緩存數(shù)據(jù)庫雙寫一致性幾種策略分析

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

    虹科干貨 | 什么是數(shù)據(jù)庫一致性

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

    如何保證緩存一致性

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

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

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

    深入理解數(shù)據(jù)備份的關(guān)鍵原則:應(yīng)用一致性與崩潰一致性的區(qū)別

    深入理解數(shù)據(jù)備份的關(guān)鍵原則:應(yīng)用一致性與崩潰一致性的區(qū)別 在數(shù)字化時(shí)代,數(shù)據(jù)備份成為了企業(yè)信息安全的核心環(huán)節(jié)。但在備份過程中,兩個(gè)關(guān)鍵概念——應(yīng)用
    的頭像 發(fā)表于 03-11 11:29 ?910次閱讀
    深入理解<b class='flag-5'>數(shù)據(jù)</b>備份的關(guān)鍵原則:應(yīng)用<b class='flag-5'>一致性</b>與崩潰<b class='flag-5'>一致性</b>的區(qū)別

    異構(gòu)計(jì)算下緩存一致性的重要

    在眾多回復(fù)中,李博杰同學(xué)的回答被認(rèn)為質(zhì)量最高。他首先將緩存一致性分為兩個(gè)主要場景:是主機(jī)內(nèi)CPU與設(shè)備間的一致性;二是跨主機(jī)的一致性
    的頭像 發(fā)表于 10-24 17:00 ?542次閱讀
    異構(gòu)計(jì)算下<b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>的重要<b class='flag-5'>性</b>
    主站蜘蛛池模板: 竹菊影视一区二区三区| 99久久国产免费福利| 国产精品亚洲欧美一区麻豆| 欧洲最大无人区免费高清完整版| 2019在秋霞理论| 91嫩草视频在线观看| 久久精品国产清白在天天线| 亚洲精品色婷婷在线蜜芽| 国产久爱青草视频在线观看| 婷婷午夜影院| 国产成人精品系列在线观看| 日韩在线视频www色| 大陆午夜伦理| 日韩人妻少妇一区二区三区| 成人特级毛片| 日本久久中文字幕| 成 人 动漫3d 在线看| 人妻熟女斩五十路0930| GOGOGO高清在线播放韩国| 国内精品久久久久久久999下| 校园女教师之禁区| 国产网红主播精品福利大秀专区| 午夜伦理伦理片在线观| 国产人妻午夜无码AV天堂| 午夜天堂AV久久久噜噜噜| 国产午夜在线视频| 亚洲欧美色综合影院| 久久99国产视频| 午夜福利院电影| 国产一区二区在线免费观看| 日韩高清特级特黄毛片| 调教椅上的调教SM总裁被调教| 色偷偷男人的天堂a v| 国产精品日韩欧美一区二区三区| 午夜福利自怕| 经典WC女厕所里TV| 中文字幕亚洲男人的天堂网络| 蜜芽tv在线观看免费网站| qvod12| 手机毛片免费看| 国产一区二区免费在线观看|