亚洲精品久久久久久久久久久,亚洲国产精品一区二区制服,亚洲精品午夜精品,国产成人精品综合在线观看,最近2019中文字幕一页二页

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

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

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

Redis緩存更新一致性的方式

jf_ro2CN3Fa ? 來(lái)源:博客園 ? 作者:Finley ? 2022-11-21 10:40 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

當(dāng)執(zhí)行寫(xiě)操作后,需要保證從緩存讀取到的數(shù)據(jù)與數(shù)據(jù)庫(kù)中持久化的數(shù)據(jù)是一致的,因此需要對(duì)緩存進(jìn)行更新。

因?yàn)樯婕暗綌?shù)據(jù)庫(kù)和緩存兩步操作,難以保證更新的原子性。

在設(shè)計(jì)更新策略時(shí),我們需要考慮多個(gè)方面的問(wèn)題:

對(duì)系統(tǒng)吞吐量的影響:比如更新緩存策略產(chǎn)生的數(shù)據(jù)庫(kù)負(fù)載小于刪除緩存策略的負(fù)載

并發(fā)安全性:并發(fā)讀寫(xiě)時(shí)某些異常操作順序可能造成數(shù)據(jù)不一致,如緩存中長(zhǎng)期保存過(guò)時(shí)數(shù)據(jù)

更新失敗的影響:若某個(gè)操作失敗,如何對(duì)業(yè)務(wù)影響降到最小

檢測(cè)和修復(fù)故障的難度: 操作失敗導(dǎo)致的錯(cuò)誤會(huì)在日志留下詳細(xì)的記錄容易檢測(cè)和修復(fù)。并發(fā)問(wèn)題導(dǎo)致的數(shù)據(jù)錯(cuò)誤沒(méi)有明顯的痕跡難以發(fā)現(xiàn),且在流量高峰期更容易產(chǎn)生并發(fā)錯(cuò)誤產(chǎn)生的業(yè)務(wù)風(fēng)險(xiǎn)較大。

更新緩存有兩種方式:

刪除失效緩存: 讀取時(shí)會(huì)因?yàn)槲疵芯彺娑鴱臄?shù)據(jù)庫(kù)中讀取新的數(shù)據(jù)并更新到緩存中

更新緩存: 直接將新的數(shù)據(jù)寫(xiě)入緩存覆蓋過(guò)期數(shù)據(jù)

更新緩存和更新數(shù)據(jù)庫(kù)有兩種順序:

先數(shù)據(jù)庫(kù)后緩存

先緩存后數(shù)據(jù)庫(kù)

兩兩組合共有四種更新策略,現(xiàn)在我們逐一進(jìn)行分析。

并發(fā)問(wèn)題通常由于后開(kāi)始的線程卻先完成操作導(dǎo)致,我們把這種現(xiàn)象稱為“搶跑”。下面我們逐一分析四種策略中“搶跑”帶來(lái)的錯(cuò)誤。

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

若數(shù)據(jù)庫(kù)更新成功,刪除緩存操作失敗,則此后讀到的都是緩存中過(guò)期的數(shù)據(jù),造成不一致問(wèn)題。

可能存在讀寫(xiě)線程競(jìng)爭(zhēng)導(dǎo)致的并發(fā)錯(cuò)誤:

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro

視頻教程:https://doc.iocoder.cn/video/

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

同刪除緩存策略一樣,若數(shù)據(jù)庫(kù)更新成功緩存更新失敗則會(huì)造成數(shù)據(jù)不一致問(wèn)題。

該策略同樣存在讀寫(xiě)線程競(jìng)爭(zhēng)導(dǎo)致數(shù)據(jù)不一致的問(wèn)題:

ec4a5aa0-68b7-11ed-8abf-dac502259ad0.png

也可能因?yàn)閮蓚€(gè)寫(xiě)線程競(jìng)爭(zhēng)導(dǎo)致并發(fā)錯(cuò)誤:

ec6d143c-68b7-11ed-8abf-dac502259ad0.png

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud

視頻教程:https://doc.iocoder.cn/video/

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

可能發(fā)生的并發(fā)錯(cuò)誤:

ec97c696-68b7-11ed-8abf-dac502259ad0.png

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

若緩存更新成功數(shù)據(jù)庫(kù)更新失敗, 則此后讀到的都是未持久化的數(shù)據(jù)。因?yàn)榫彺嬷械臄?shù)據(jù)是易失的,這種狀態(tài)非常危險(xiǎn)。

因?yàn)閿?shù)據(jù)庫(kù)因?yàn)殒I約束導(dǎo)致寫(xiě)入失敗的可能性較高,所以這種策略風(fēng)險(xiǎn)較大。

可能發(fā)生的并發(fā)錯(cuò)誤:

ecd69df8-68b7-11ed-8abf-dac502259ad0.png

兩個(gè)寫(xiě)線程競(jìng)爭(zhēng)也會(huì)導(dǎo)致數(shù)據(jù)不一致:

ecf7b934-68b7-11ed-8abf-dac502259ad0.png

解決方案

使用 CAS

CAS (Check-And-Set 或 Compare-And-Swap)是一種常見(jiàn)的保證并發(fā)安全的手段。CAS 當(dāng)且僅當(dāng)客戶端最后一次取值后該 key 沒(méi)有被其他客戶端修改的情況下,才允許當(dāng)前客戶端將新值寫(xiě)入。

funcCAS(oldVal,newVal){
ifcache.get()==oldVal{
cache.set(newVal)
}
}

時(shí)間 線程A 線程B 數(shù)據(jù)庫(kù) 緩存
0 v0 v0
1 更新數(shù)據(jù)庫(kù)為 v1 v1 v0
2 更新數(shù)據(jù)庫(kù)為 v2 v2 v0
3 執(zhí)行 CAS 操作:當(dāng)且僅當(dāng)緩存中為 v0 時(shí)將 v2 寫(xiě)入緩存 v2 v2
4 執(zhí)行 CAS 操作:當(dāng)且僅當(dāng)緩存中為 v0 時(shí)將v1寫(xiě)入緩存。當(dāng)前緩存為 v2 故放棄寫(xiě)緩存 v2 v2

由上圖可見(jiàn),CAS 可以有效的避免并發(fā)錯(cuò)誤的發(fā)生。

目前一些兼容 Redis 協(xié)議的中間件已經(jīng)提供了 CAS 命令的支持,比如阿里的 Tair 以及騰訊的 Tendis。

Redis 官方提供了 Watch + 事務(wù)的方法來(lái)支持 CAS, 或者使用 redis 中 lua 腳本原子性執(zhí)行的特點(diǎn)來(lái)實(shí)現(xiàn) CAS。不過(guò)由于代碼較為復(fù)雜,這兩種方案都不常見(jiàn)。

使用分布式鎖

CAS 假設(shè)發(fā)生并發(fā)問(wèn)題的概率不大, 所以 CAS 也被稱為樂(lè)觀鎖。那么悲觀鎖能否解決我們的問(wèn)題呢?

還是以「先更新數(shù)據(jù)庫(kù),再更新緩存」方案中兩個(gè)寫(xiě)線程競(jìng)爭(zhēng)為例, 我們要求任何線程在寫(xiě)入或讀取數(shù)據(jù)庫(kù)前都需要獲取排它鎖。

時(shí)間 線程A 線程B 數(shù)據(jù)庫(kù) 緩存
0 v0 v0
1 獲取排它鎖 v0 v0
2 更新數(shù)據(jù)庫(kù)為 v1 v1 v0
3 更新緩存為 v1 v1 v1
4 等待排它鎖 v1 v1
5 釋放排它鎖 v1 v1
6 獲得排它鎖 v1 v1
7 更新數(shù)據(jù)庫(kù)為 v2 v2 v1
8 更新緩存為 v2 v2 v2
9 釋放排它鎖 v2 v2

分布式鎖同樣可以解決并發(fā)問(wèn)題,只是成本可能略高。

異步更新

阿里開(kāi)源了 MySQL 數(shù)據(jù)庫(kù)binlog的增量訂閱和消費(fèi)組件 - canal。canal 模擬從庫(kù)獲得主庫(kù)的 binlog 更新,然后將更新數(shù)據(jù)寫(xiě)入 MQ 或直接進(jìn)行消費(fèi)。

我們可以讓API服務(wù)器只負(fù)責(zé)寫(xiě)入數(shù)據(jù)庫(kù),另一個(gè)線程訂閱數(shù)據(jù)庫(kù) binlog 增量進(jìn)行緩存更新。

因?yàn)?binlog 是有序的,因此可以避免兩個(gè)寫(xiě)線程競(jìng)爭(zhēng)。但我們?nèi)匀恍枰鉀Q讀寫(xiě)線程競(jìng)爭(zhēng)的問(wèn)題:

ed2a5a56-68b7-11ed-8abf-dac502259ad0.png

這里同樣可以 CAS 解千愁:

ed8614a4-68b7-11ed-8abf-dac502259ad0.png

延時(shí)雙刪

使用刪除緩存策略時(shí)讀線程先開(kāi)始卻后寫(xiě)緩存會(huì)導(dǎo)致不一致,那么我們?cè)谧x線程結(jié)束后再次清除緩存是不是就可以解除錯(cuò)誤狀態(tài)了?延時(shí)雙刪就是寫(xiě)線程等待一段時(shí)間“確?!弊x線程都結(jié)束后再次刪除緩存,以此清除可能的錯(cuò)誤緩存數(shù)據(jù)。

eda9ebb8-68b7-11ed-8abf-dac502259ad0.png

理論上我們無(wú)法給出一個(gè)時(shí)間來(lái)“確?!弊x線程都結(jié)束,所以仍有存在并發(fā)問(wèn)題的可能。但是延時(shí)雙刪實(shí)現(xiàn)成本很低而且極大的減少了并發(fā)問(wèn)題出現(xiàn)的概率,不失為一種簡(jiǎn)單實(shí)用的手段。






審核編輯:劉清

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

    關(guān)注

    0

    文章

    35

    瀏覽量

    15507
  • MYSQL數(shù)據(jù)庫(kù)

    關(guān)注

    0

    文章

    96

    瀏覽量

    10164
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    390

    瀏覽量

    11966

原文標(biāo)題:講講 Redis 緩存更新一致性

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    介紹ARM存儲(chǔ)一致性模型的相關(guān)知識(shí)

    今天要說(shuō)的這個(gè)是存儲(chǔ)一致性(memory consistency),不要跟前面講過(guò)緩存一致性(cache coherence)混淆了。
    的頭像 發(fā)表于 02-14 09:19 ?2564次閱讀

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

    數(shù)據(jù)庫(kù)壓力。當(dāng)乘客購(gòu)買(mǎi)成功之后,數(shù)據(jù)庫(kù)發(fā)生了變化,需要及時(shí)更新緩存中的數(shù)據(jù),以便于其他乘客能從緩存中及時(shí)獲取最新車(chē)票信息。這就是緩存一致性。
    的頭像 發(fā)表于 09-25 15:25 ?1637次閱讀
    如何解決數(shù)據(jù)庫(kù)與<b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>

    Redis緩存和MySQL數(shù)據(jù)不一致原因和解決方案

    高并發(fā)架構(gòu)系列:Redis緩存和MySQL數(shù)據(jù)一致性方案詳解
    發(fā)表于 03-27 15:55

    一致性規(guī)劃研究

    針對(duì)一致性規(guī)劃的高度求解復(fù)雜度,分析主流一致性規(guī)劃器的求解策略,給出影響一致性規(guī)劃器性能的主要因素:?jiǎn)l(fā)信息的有效,信念狀態(tài)表示方法的緊湊
    發(fā)表于 04-06 08:43 ?12次下載

    加速器一致性接口

    提供異步緩存一致性直接訪問(wèn)PS的入口。處理器可以標(biāo)記ACP上的傳輸為一致性或非一致性。PL端的AXI主機(jī)通過(guò)ARUSERS[1:0]指示是否為一致性
    發(fā)表于 11-17 15:04 ?4272次閱讀

    基于軌跡標(biāo)簽的謠言一致性維護(hù)算法

    針對(duì)發(fā)布/訂閱系統(tǒng)中緩存副本一致性維護(hù)問(wèn)題,首先,對(duì)原有基于謠言的一致性維護(hù)算法進(jìn)行改進(jìn),提出種基于軌跡標(biāo)簽的謠言一致性維護(hù)算法。該算法通
    發(fā)表于 12-17 11:35 ?0次下載
    基于軌跡標(biāo)簽的謠言<b class='flag-5'>一致性</b>維護(hù)算法

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

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

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

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

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

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

    介紹下cpu緩存一致性(MESI協(xié)議)

    之前介紹了java并發(fā)包的cas原理和java內(nèi)存模型,這篇我們介紹下cpu緩存一致性原理,可以幫助我們更好的理解cas的底層原理。
    的頭像 發(fā)表于 06-09 16:01 ?5675次閱讀
    介紹下cpu<b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>(MESI協(xié)議)

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

    電子發(fā)燒友網(wǎng)站提供《管理基于Cortex-M7的MCU的高速緩存一致性.pdf》資料免費(fèi)下載
    發(fā)表于 09-25 10:11 ?0次下載
    管理基于Cortex-M7的MCU的高速<b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>

    如何保證緩存一致性

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

    redis與mysql如何保持?jǐn)?shù)據(jù)一致性

    Redis和MySQL是兩個(gè)常用的數(shù)據(jù)庫(kù)系統(tǒng),它們都有自己的特點(diǎn)和用途。在某些場(chǎng)景下,我們可能需要將Redis和MySQL進(jìn)行結(jié)合使用,并保持?jǐn)?shù)據(jù)的一致性、
    的頭像 發(fā)表于 11-16 11:27 ?1383次閱讀

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

    基本流程就是客戶端A請(qǐng)求,先去刪除緩存,然后將數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù),此時(shí)客戶端B查詢先去查詢緩存緩存沒(méi)有返回,去查數(shù)據(jù)庫(kù),此時(shí)還沒(méi)有完成主從同步,拿到是從庫(kù)的舊數(shù)據(jù),然后將舊數(shù)據(jù)進(jìn)行緩存,
    的頭像 發(fā)表于 12-02 14:23 ?1534次閱讀
    <b class='flag-5'>Redis</b><b class='flag-5'>緩存</b>與Mysql如何保證<b class='flag-5'>一致性</b>?

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

    在眾多回復(fù)中,李博杰同學(xué)的回答被認(rèn)為質(zhì)量最高。他首先將緩存一致性分為兩個(gè)主要場(chǎng)景:是主機(jī)內(nèi)CPU與設(shè)備間的一致性;二是跨主機(jī)的一致性
    的頭像 發(fā)表于 10-24 17:00 ?2311次閱讀
    異構(gòu)計(jì)算下<b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>的重要<b class='flag-5'>性</b>