自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

讓數(shù)據(jù)庫(kù)和緩存數(shù)據(jù)保持一致的三種策略

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù)
如何保證緩存和數(shù)據(jù)庫(kù)的一致性,這算得上是個(gè)老生常談的話題啦,看到好多技術(shù)新人在寫更新緩存數(shù)據(jù)代碼,采用了非常復(fù)雜甚至“詭異”的方案,甚為不解。

一、背景

目前隨著緩存架構(gòu)方案越來(lái)越成熟化,通常做法是引入「緩存」來(lái)提高讀性能,架構(gòu)模型就變成了這樣:

圖片圖片

先來(lái)看一下什么時(shí)候創(chuàng)建緩存,前端請(qǐng)求的讀操作先從緩存中查詢數(shù)據(jù),如果沒(méi)有命中數(shù)據(jù),則查詢數(shù)據(jù)庫(kù),從數(shù)據(jù)庫(kù)查詢成功后,返回結(jié)果,同時(shí)更新緩存,方便下次操作。

在數(shù)據(jù)不發(fā)生變更的情況下,這種方式?jīng)]有問(wèn)題,如果數(shù)據(jù)發(fā)生了更新操作,就必須要考慮如何操作緩存,保證一致性。

如何保證緩存和數(shù)據(jù)庫(kù)的一致性,這算得上是個(gè)老生常談的話題啦,看到好多技術(shù)新人在寫更新緩存數(shù)據(jù)代碼,采用了非常復(fù)雜甚至“詭異”的方案,甚為不解。

今天就一起花點(diǎn)兒時(shí)間來(lái)聊聊吧~

二、緩存和數(shù)據(jù)庫(kù)數(shù)據(jù)一致性問(wèn)題

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

如果緩存更新成功了,但數(shù)據(jù)庫(kù)更新失敗,那么此時(shí)緩存中是最新值,但數(shù)據(jù)庫(kù)中是「舊值」。

雖然此時(shí)讀請(qǐng)求可以命中緩存,拿到正確的值,但是,一旦緩存「失效」,就會(huì)從數(shù)據(jù)庫(kù)中讀取到「舊值」,重建緩存也是這個(gè)舊值。

這時(shí)用戶會(huì)發(fā)現(xiàn)自己之前修改的數(shù)據(jù)又「變回去」了,對(duì)業(yè)務(wù)造成影響。

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

如果數(shù)據(jù)庫(kù)更新成功了,但緩存更新失敗,那么此時(shí)數(shù)據(jù)庫(kù)中是最新值,緩存中是「舊值」。

之后的讀請(qǐng)求讀到的都是舊數(shù)據(jù),只有當(dāng)緩存「失效」后,才能從數(shù)據(jù)庫(kù)中得到正確的值。

這時(shí)用戶會(huì)發(fā)現(xiàn),自己剛剛修改了數(shù)據(jù),但卻看不到變更,一段時(shí)間過(guò)后,數(shù)據(jù)才變更過(guò)來(lái),對(duì)業(yè)務(wù)也會(huì)有影響。

可見(jiàn),上面兩種情況,無(wú)論誰(shuí)先誰(shuí)后,但凡后者發(fā)生異常,就會(huì)對(duì)業(yè)務(wù)造成影響。那怎么解決這個(gè)問(wèn)題呢?

三、緩存更新Design Pattern

介紹幾個(gè)也許有效的套路給大家吧~ 希望有幫助。

(1)Cache Aside Pattern

圖片圖片

圖片圖片

如上圖所示,一個(gè)是查詢操作,一個(gè)是更新操作的并發(fā)。

首先,沒(méi)有了刪除cache數(shù)據(jù)的操作了,而是先更新了數(shù)據(jù)庫(kù)中的數(shù)據(jù),此時(shí),緩存依然有效,所以,并發(fā)的查詢操作拿的是沒(méi)有更新的數(shù)據(jù),但是,更新操作馬上讓緩存的失效了,后續(xù)的查詢操作再把數(shù)據(jù)從數(shù)據(jù)庫(kù)中拉出來(lái)。而不會(huì)像文章開頭的那個(gè)邏輯產(chǎn)生的問(wèn)題,后續(xù)的查詢操作一直都在取舊數(shù)據(jù)。

那么,是不是Cache Aside這個(gè)就不會(huì)有并發(fā)問(wèn)題了?

不是的。

比如,一個(gè)是讀操作,但是沒(méi)有命中緩存,然后就到數(shù)據(jù)庫(kù)中取數(shù)據(jù),此時(shí)來(lái)了一個(gè)寫操作,寫完數(shù)據(jù)庫(kù)后,讓緩存失效,然后,之前的那個(gè)讀操作再把老的數(shù)據(jù)放進(jìn)去,所以,會(huì)造成臟數(shù)據(jù)。

(2)Read/Write Through Pattern

  • Read Through

Read Through 套路就是在查詢操作中更新緩存,也就是說(shuō),當(dāng)緩存失效的時(shí)候(過(guò)期或LRU換出),Cache Aside是由調(diào)用方負(fù)責(zé)把數(shù)據(jù)加載入緩存,而Read Through則用緩存服務(wù)自己來(lái)加載,從而對(duì)應(yīng)用方是透明的。

  • Write Through

Write Through 套路和Read Through相仿,不過(guò)是在更新數(shù)據(jù)時(shí)發(fā)生。當(dāng)有數(shù)據(jù)更新的時(shí)候,如果沒(méi)有命中緩存,直接更新數(shù)據(jù)庫(kù),然后返回。如果命中了緩存,則更新緩存,然后再由Cache自己更新數(shù)據(jù)庫(kù)(這是一個(gè)同步操作)

操作邏輯如下圖所示:

圖片圖片

(3)Write Behind Caching Pattern

基本邏輯如下:

圖片圖片

Write Behind 又叫 Write Back。

簡(jiǎn)單說(shuō)就是,在更新數(shù)據(jù)的時(shí)候,只更新緩存,不更新數(shù)據(jù)庫(kù),而我們的緩存會(huì)異步地批量更新數(shù)據(jù)庫(kù)。這個(gè)設(shè)計(jì)的好處就是讓數(shù)據(jù)的I/O操作飛快無(wú)比(直接操作內(nèi)存的嘛 ),因?yàn)楫惒?,write backg還可以合并對(duì)同一個(gè)數(shù)據(jù)的多次操作,所以性能的提高是相當(dāng)可觀的。

但是,其帶來(lái)的問(wèn)題是,數(shù)據(jù)不是強(qiáng)一致性的,而且可能會(huì)丟失(我們知道Unix/Linux非正常關(guān)機(jī)會(huì)導(dǎo)致數(shù)據(jù)丟失,類似這種情況)。

另外,Write Back實(shí)現(xiàn)邏輯比較復(fù)雜,因?yàn)樗枰猼rack有哪些數(shù)據(jù)是被更新了的,需要刷到持久層上。操作系統(tǒng)的write back會(huì)在僅當(dāng)這個(gè)cache需要失效的時(shí)候,才會(huì)被真正持久起來(lái),比如,內(nèi)存不夠了,或是進(jìn)程退出了等情況,這又叫l(wèi)azy write。

四、總結(jié)

對(duì)于這個(gè)老生常談的問(wèn)題,分析起來(lái)其實(shí)并不簡(jiǎn)單。

額外分享幾點(diǎn)自己心得給你:

1、性能和一致性不能同時(shí)滿足,為了性能考慮,通常會(huì)采用「最終一致性」的方案;

2、掌握緩存和數(shù)據(jù)庫(kù)一致性問(wèn)題,核心問(wèn)題有 3 點(diǎn):緩存利用率、并發(fā)、緩存 + 數(shù)據(jù)庫(kù)一起成功問(wèn)題;

3、失敗場(chǎng)景下要保證一致性,常見(jiàn)手段就是「重試」,同步重試會(huì)影響吞吐量,所以通常會(huì)采用異步重試的方案;

4、訂閱變更日志的思想,本質(zhì)是把權(quán)威數(shù)據(jù)源(例如 MySQL)當(dāng)做 leader 副本,讓其它異質(zhì)系統(tǒng)(例如 Redis / Elasticsearch)成為它的 follower 副本,通過(guò)同步變更日志的方式,保證 leader 和 follower 之間保持一致。

面講到的幾種緩存更新的設(shè)計(jì)方式,都是前人總結(jié)出來(lái)的經(jīng)驗(yàn),這些方式或多或少都有一些弊端,并不完美,實(shí)際上也很難有完美的設(shè)計(jì)。大家在做系統(tǒng)設(shè)計(jì)的時(shí)候,也不要去追求完美,要有一些取舍,找到一種最適合自己業(yè)務(wù)場(chǎng)景的方式就行。

圖片圖片


責(zé)任編輯:武曉燕 來(lái)源: 架構(gòu)精進(jìn)之路
相關(guān)推薦

2019-10-28 09:26:35

PylintPython編程語(yǔ)言

2022-03-31 08:21:14

數(shù)據(jù)庫(kù)緩存雙寫數(shù)據(jù)一致性

2022-04-01 16:55:22

數(shù)據(jù)庫(kù)緩存日志

2019-09-20 21:50:47

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

2018-07-15 08:18:44

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

2018-05-16 16:10:28

數(shù)據(jù)庫(kù)緩存MySQL

2021-12-01 08:26:27

數(shù)據(jù)庫(kù)緩存技術(shù)

2024-10-28 12:41:25

2022-03-29 10:39:10

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

2021-06-11 09:21:58

緩存數(shù)據(jù)庫(kù)Redis

2021-02-04 15:05:36

人工智能機(jī)器學(xué)習(xí)技術(shù)

2022-09-22 07:27:49

IT/OT治理網(wǎng)絡(luò)安全物聯(lián)網(wǎng)安全

2021-12-23 06:57:32

企業(yè)策略數(shù)據(jù)

2023-08-01 07:42:33

Redis數(shù)據(jù)項(xiàng)目

2018-09-11 10:46:10

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

2020-09-03 09:45:38

緩存數(shù)據(jù)庫(kù)分布式

2020-09-04 06:32:08

緩存數(shù)據(jù)庫(kù)接口

2011-08-05 15:51:44

MySQL數(shù)據(jù)庫(kù)緩存

2018-07-27 10:56:10

2021-05-27 09:27:35

開發(fā)技能緩存
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)