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ù)庫(kù)雙寫一致性幾種策略分析

OSC開源社區(qū) ? 來(lái)源:OSCHINA 社區(qū) ? 2023-04-21 10:27 ? 次閱讀

一、背景

在高并發(fā)場(chǎng)景中,為防止大量請(qǐng)求直接訪問(wèn)數(shù)據(jù)庫(kù),緩解數(shù)據(jù)庫(kù)壓力,常用的方式一般會(huì)增加緩存層起到緩沖作用,減少數(shù)據(jù)庫(kù)壓力。引入緩存,就會(huì)涉及到緩存與數(shù)據(jù)庫(kù)中數(shù)據(jù)如何保持一致性問(wèn)題,本文將對(duì)幾種緩存與數(shù)據(jù)庫(kù)保證數(shù)據(jù)一致性的使用方式進(jìn)行分析。為保證高并發(fā)性能,以下分析場(chǎng)景不考慮執(zhí)行的原子性及加鎖等強(qiáng)一致性要求的場(chǎng)景,僅追求最終一致性。

二、讀取過(guò)程

f2d7ca0e-df9c-11ed-bfe3-dac502259ad0.png

?讀緩存

?如果緩存里沒(méi)有值,那就讀取數(shù)據(jù)庫(kù)的值

?同時(shí)把這個(gè)值寫進(jìn)緩存中

三、更新過(guò)程

更新操作有多種策略,各有優(yōu)劣,主要針對(duì)此場(chǎng)景進(jìn)行分析

策略 1:先更新 db,再刪除緩存(常用的 Cache-Aside Pattern旁路緩存)

f2ecfe60-df9c-11ed-bfe3-dac502259ad0.png

問(wèn)題:

1. 如果更新 db 成功,刪緩存失敗,將導(dǎo)致數(shù)據(jù)不一致

2. 極端場(chǎng)景,請(qǐng)求 A 讀,B 寫

1) 此時(shí)緩存剛好失效 2)A 查庫(kù)得到舊值 3)B 更新 DB 成功

4)B 刪除緩存 5)A 將查到的舊值更新到緩存中

此場(chǎng)景的發(fā)生需要步驟 2)查 db 始終慢于 3)的更新 db,才能導(dǎo)致 4)先于 5)執(zhí)行,通常 db 的查詢是要快于寫入的,所以此極端場(chǎng)景的產(chǎn)生過(guò)于嚴(yán)格,不易發(fā)生

策略 2:先更新 db, 再更新緩存

f2f5faa6-df9c-11ed-bfe3-dac502259ad0.png

問(wèn)題:

1. 并發(fā)更新場(chǎng)景下,更新緩存會(huì)導(dǎo)致數(shù)據(jù)不一致

2. 根據(jù)讀寫比,考慮是否有必要頻繁同步更新緩存,而且,如果構(gòu)造緩存中數(shù)據(jù)過(guò)于復(fù)雜,或者數(shù)據(jù)更新頻繁,但是讀取并不頻繁的情況,還會(huì)造成不必要的性能損耗

此種方式不推薦

策略 3: 先更新緩存,再更新 db

f3000758-df9c-11ed-bfe3-dac502259ad0.png

同上,不推薦

策略 4:先刪緩存,再更新 db

f30af1fe-df9c-11ed-bfe3-dac502259ad0.png

??先刪緩存,雖然解決了策略 1 中,后刪緩存如果失敗的場(chǎng)景,但也會(huì)發(fā)生不一致的問(wèn)題

例如:請(qǐng)求 A 刪除緩存,這時(shí)請(qǐng)求 B 來(lái)查,就會(huì)擊穿到數(shù)據(jù)庫(kù),B 讀取到舊的值后寫入緩存,A 正常更新 db, 由于時(shí)間差導(dǎo)致數(shù)據(jù)不一致的情況

策略 5:緩存延時(shí)雙刪

f31afed2-df9c-11ed-bfe3-dac502259ad0.png

??該策略兼容了策略 1 和策略 4, 解決了先刪緩存還是后刪緩存的問(wèn)題,如策略 1 中,更新 db 后刪緩存失敗和策略 4 中的不一致場(chǎng)景,該策略可以將延時(shí)時(shí)間內(nèi)(比如延時(shí) 10ms)所造成的緩存臟數(shù)據(jù),再次刪除。但是,如果延時(shí)刪緩存失敗,策略 4 中不一致問(wèn)題還會(huì)發(fā)生,同時(shí)延時(shí)的實(shí)現(xiàn),如創(chuàng)建線程,或者引入 mq 異步,可能會(huì)增加系統(tǒng)復(fù)雜度問(wèn)題。

策略 6:變種雙刪,前置緩存過(guò)期時(shí)間

f3365d08-df9c-11ed-bfe3-dac502259ad0.png

?該策略針對(duì)策略 1 中后刪緩存失敗的場(chǎng)景,前置一層緩存數(shù)據(jù)過(guò)期時(shí)間(具體時(shí)間根據(jù)自身系統(tǒng)本身評(píng)估,如可覆蓋 db 讀寫耗時(shí)或一致性容忍度等),更新 db 后就算刪緩存失敗,在 expire 時(shí)間后也能保證緩存中無(wú)數(shù)據(jù)。同時(shí),前置 expire 失敗,或者更新 db 失敗,都不會(huì)影響數(shù)據(jù)一致。

能夠解決策略 4 中的問(wèn)題:請(qǐng)求 A 刪除緩存,這時(shí)請(qǐng)求 B 來(lái)查,就會(huì)擊穿到數(shù)據(jù)庫(kù),B 讀取到舊的值后寫入緩存,A 正常更新 db, 由于時(shí)間差導(dǎo)致數(shù)據(jù)不一致的情況,描述圖如下:

f349b3d0-df9c-11ed-bfe3-dac502259ad0.png

??本策略中步驟 1 為 expire 緩存,不會(huì)發(fā)生擊穿緩存到數(shù)據(jù)庫(kù)的情況,數(shù)據(jù)將直接返回。除非更極端情況,如下圖:

expire 時(shí)間沒(méi)有覆蓋住更新 db 的耗時(shí),類似策略 1 中極端場(chǎng)景,此處不贅述

f3559e16-df9c-11ed-bfe3-dac502259ad0.png

四、總結(jié)

對(duì)于每種方案策略,各有利弊,但一致性問(wèn)題始終存在(文章開頭排除了原子性和鎖),只是發(fā)生的幾率在一點(diǎn)點(diǎn)慢慢變小了,方案的評(píng)估不僅要根據(jù)自身系統(tǒng)的業(yè)務(wù)場(chǎng)景,如讀寫比、并發(fā)量、一致性容忍度,還要考慮系統(tǒng)復(fù)雜度,投入產(chǎn)出比等,尋找最合適的方案。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)投訴

原文標(biāo)題:緩存與數(shù)據(jù)庫(kù)雙寫一致性幾種策略分析

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    級(jí)聯(lián)一致性和移相器校準(zhǔn)應(yīng)用手冊(cè)

    電子發(fā)燒友網(wǎng)站提供《級(jí)聯(lián)一致性和移相器校準(zhǔn)應(yīng)用手冊(cè).pdf》資料免費(fèi)下載
    發(fā)表于 08-29 10:48 ?0次下載
    級(jí)聯(lián)<b class='flag-5'>一致性</b>和移相器校準(zhǔn)應(yīng)用手冊(cè)

    LIN一致性測(cè)試規(guī)范2.1

    電子發(fā)燒友網(wǎng)站提供《LIN一致性測(cè)試規(guī)范2.1.pdf》資料免費(fèi)下載
    發(fā)表于 08-15 17:14 ?2次下載

    請(qǐng)問(wèn)ESP-NOW對(duì)數(shù)據(jù)的完整一致性有校驗(yàn)嗎?

    當(dāng)使用ESP-NOW時(shí),傳遞的數(shù)據(jù)在傳輸層有對(duì)數(shù)據(jù)包的完整(比如對(duì)面?zhèn)鹘o我的字節(jié)數(shù)和我收到的字節(jié)數(shù)是否相同)有底層校驗(yàn)嗎? 還有這個(gè)數(shù)據(jù)包是否經(jīng)過(guò)了CRC等差錯(cuò)檢測(cè)的校驗(yàn)?zāi)?就是
    發(fā)表于 06-17 06:55

     QSFP一致性測(cè)試的專業(yè)測(cè)試設(shè)備

    、高速度的光纖接口模塊,廣泛應(yīng)用于數(shù)據(jù)中心、高速以太網(wǎng)和光纖通信等領(lǐng)域。本文將詳細(xì)探討QSFP一致性測(cè)試的目的、測(cè)試內(nèi)容、測(cè)試方法以及測(cè)試的重要等方面。 QSFP一致性測(cè)試的目的是確
    的頭像 發(fā)表于 03-14 10:40 ?411次閱讀
     QSFP<b class='flag-5'>一致性</b>測(cè)試的專業(yè)測(cè)試設(shè)備

    企業(yè)數(shù)據(jù)備份體系化方法論的七大原則:深入理解數(shù)據(jù)備份的關(guān)鍵原則:應(yīng)用一致性與崩潰一致性的區(qū)別

    在數(shù)字化時(shí)代,數(shù)據(jù)備份成為了企業(yè)信息安全的核心環(huán)節(jié)。但在備份過(guò)程中,兩個(gè)關(guān)鍵概念——應(yīng)用一致性和崩潰一致性,常常被誤解或混淆。本文旨在闡明這兩個(gè)概念的差異,并分析它們?cè)?/div>
    的頭像 發(fā)表于 03-11 14:05 ?328次閱讀
    企業(yè)<b class='flag-5'>數(shù)據(jù)</b>備份體系化方法論的七大原則:深入理解<b class='flag-5'>數(shù)據(jù)</b>備份的關(guān)鍵原則:應(yīng)用<b class='flag-5'>一致性</b>與崩潰<b class='flag-5'>一致性</b>的區(qū)別

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

    這兩個(gè)概念的差異,并分析它們?cè)?b class='flag-5'>數(shù)據(jù)備份中的重要,以便讀者能夠更有效地保護(hù)企業(yè)數(shù)據(jù)。 1. 概念區(qū)分: 應(yīng)用一致性和崩潰
    的頭像 發(fā)表于 03-11 11:29 ?642次閱讀
    深入理解<b class='flag-5'>數(shù)據(jù)</b>備份的關(guān)鍵原則:應(yīng)用<b class='flag-5'>一致性</b>與崩潰<b class='flag-5'>一致性</b>的區(qū)別

    DDR一致性測(cè)試的操作步驟

    DDR一致性測(cè)試的操作步驟? DDR(雙數(shù)據(jù)率)一致性測(cè)試是對(duì)DDR內(nèi)存模塊進(jìn)行測(cè)試以確保其性能和可靠。在進(jìn)行DDR一致性測(cè)試時(shí),需要遵循
    的頭像 發(fā)表于 02-01 16:24 ?1070次閱讀

    CPU Cache是如何保證緩存一致性的?

    我們介紹`CPU Cache`的組織架構(gòu)及其進(jìn)行**讀操作**時(shí)的尋址方式,但是緩存不僅僅只有讀操作,還有 **操作** ,這會(huì)帶來(lái)個(gè)新的問(wèn)題
    的頭像 發(fā)表于 12-04 15:05 ?1061次閱讀
    CPU Cache是如何保證<b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>的?

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

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

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

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

    什么是鋰離子電池不一致性?如何提高鋰離子電池的一致性?

    什么是鋰離子電池不一致性?鋰離子電池不穩(wěn)定的原因?如何提高鋰離子電池的一致性? 鋰離子電池不一致性是指同批次或不同批次的鋰離子電池在性能上出現(xiàn)不
    的頭像 發(fā)表于 11-10 14:49 ?1312次閱讀

    分布式系統(tǒng)中常見的一致性模型

    什么是一致性模型? 在分布式系統(tǒng)中,C(一致性) 和 A(可用)始終存在矛盾。若想保證可用,就必須通過(guò)復(fù)制、分片等方式冗余存儲(chǔ)。而旦進(jìn)
    的頭像 發(fā)表于 11-10 11:33 ?705次閱讀
    分布式系統(tǒng)中常見的<b class='flag-5'>一致性</b>模型

    如何保證緩存一致性

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

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

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

    管理基于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>