久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

redis如何解決緩存不一致的問(wèn)題?

本篇文章給大家?guī)?lái)了關(guān)于Redis如何解決緩存不一致的問(wèn)題,緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)不一致是如何發(fā)生的,下面就一起來(lái)看一下吧,希望對(duì)大家有幫助。

redis如何解決緩存不一致的問(wèn)題?

推薦學(xué)習(xí):Redis學(xué)習(xí)教程

緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)不一致是如何發(fā)生的?

首先,我們得清楚“數(shù)據(jù)的一致性”具體是啥意思。其實(shí),這里的“一致性”包含了兩種情況:

  • 緩存中有數(shù)據(jù),那么,緩存的數(shù)據(jù)值需要和數(shù)據(jù)庫(kù)中的值相同;
  • 緩存中本身沒有數(shù)據(jù),那么,數(shù)據(jù)庫(kù)中的值必須是最新值。

不符合這兩種情況的,就屬于緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)不一致問(wèn)題了。不過(guò),當(dāng)緩存的讀寫模式不同時(shí),緩存數(shù)據(jù)不一致的發(fā)生情況不一樣,我們的應(yīng)對(duì)方法也會(huì)有所不同,所以,我們先按照緩存讀寫模式,來(lái)分別了解下不同模式下的緩存不一致情況。我們可以把緩存分成讀寫緩存和只讀緩存。

對(duì)于讀寫緩存來(lái)說(shuō),如果要對(duì)數(shù)據(jù)進(jìn)行增刪改,就需要在緩存中進(jìn)行,同時(shí)還要根據(jù)采取的寫回策略,決定是否同步寫回到數(shù)據(jù)庫(kù)中。

同步直寫策略:寫緩存時(shí),也同步寫數(shù)據(jù)庫(kù),緩存和數(shù)據(jù)庫(kù)中的數(shù)據(jù)一致;

異步寫回策略:寫緩存時(shí)不同步寫數(shù)據(jù)庫(kù),等到數(shù)據(jù)從緩存中淘汰時(shí),再寫回?cái)?shù)據(jù)庫(kù)。使用這種策略時(shí),如果數(shù)據(jù)還沒有寫回?cái)?shù)據(jù)庫(kù),緩存就發(fā)生了故障,那么,此時(shí),數(shù)據(jù)庫(kù)就沒有最新的數(shù)據(jù)了。

所以,對(duì)于讀寫緩存來(lái)說(shuō),要想保證緩存和數(shù)據(jù)庫(kù)中的數(shù)據(jù)一致,就要采用同步直寫策略。不過(guò),需要注意的是,如果采用這種策略,就需要同時(shí)更新緩存和數(shù)據(jù)庫(kù)。所以,我們要在業(yè)務(wù)應(yīng)用中使用事務(wù)機(jī)制,來(lái)保證緩存和數(shù)據(jù)庫(kù)的更新具有原子性,也就是說(shuō),兩者要不一起更新,要不都不更新,返回錯(cuò)誤信息,進(jìn)行重試。否則,我們就無(wú)法實(shí)現(xiàn)同步直寫。

當(dāng)然,在有些場(chǎng)景下,我們對(duì)數(shù)據(jù)一致性的要求可能不是那么高,比如說(shuō)緩存的是電商商品的非關(guān)鍵屬性或者短視頻的創(chuàng)建或修改時(shí)間等,那么,我們可以使用異步寫回策略。

下面我們?cè)賮?lái)說(shuō)說(shuō)只讀緩存。對(duì)于只讀緩存來(lái)說(shuō),如果有數(shù)據(jù)新增,會(huì)直接寫入數(shù)據(jù)庫(kù);而有數(shù)據(jù)刪改時(shí),就需要把只讀緩存中的數(shù)據(jù)標(biāo)記為無(wú)效。這樣一來(lái),應(yīng)用后續(xù)再訪問(wèn)這些增刪改的數(shù)據(jù)時(shí),因?yàn)榫彺嬷袥]有相應(yīng)的數(shù)據(jù),就會(huì)發(fā)生緩存缺失。此時(shí),應(yīng)用再?gòu)臄?shù)據(jù)庫(kù)中把數(shù)據(jù)讀入緩存,這樣后續(xù)再訪問(wèn)數(shù)據(jù)時(shí),就能夠直接從緩存中讀取了。

接下來(lái),以 Tomcat 向 MySQL 中寫入和刪改數(shù)據(jù)為例,來(lái)給你解釋一下,數(shù)據(jù)的增刪改操作具體是如何進(jìn)行的,如下圖所示:

從圖中可以看到,Tomcat 上運(yùn)行的應(yīng)用,無(wú)論是新增(Insert 操作)、修改(Update 操作)、還是刪除(Delete 操作)數(shù)據(jù) X,都會(huì)直接在數(shù)據(jù)庫(kù)中增改刪。當(dāng)然,如果應(yīng)用執(zhí)行的是修改或刪除操作,還會(huì)刪除緩存的數(shù)據(jù) X。

那么,這個(gè)過(guò)程中會(huì)不會(huì)出現(xiàn)數(shù)據(jù)不一致的情況呢?考慮到新增數(shù)據(jù)和刪改數(shù)據(jù)的情況不一樣,所以我們分開來(lái)看。

  1. 新增數(shù)據(jù)
    如果是新增數(shù)據(jù),數(shù)據(jù)會(huì)直接寫到數(shù)據(jù)庫(kù)中,不用對(duì)緩存做任何操作,此時(shí),緩存中本身就沒有新增數(shù)據(jù),而數(shù)據(jù)庫(kù)中是最新值,這種情況符合我們剛剛所說(shuō)的一致性的第 2 種情況,所以,此時(shí),緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)是一致的。
  2. 刪改數(shù)據(jù)
    如果發(fā)生刪改操作,應(yīng)用既要更新數(shù)據(jù)庫(kù),也要在緩存中刪除數(shù)據(jù)。這兩個(gè)操作如果無(wú)法保證原子性,也就是說(shuō),要不都完成,要不都沒完成,此時(shí),就會(huì)出現(xiàn)數(shù)據(jù)不一致問(wèn)題了。這個(gè)問(wèn)題比較復(fù)雜,我們來(lái)分析一下。

我們假設(shè)應(yīng)用先刪除緩存,再更新數(shù)據(jù)庫(kù),如果緩存刪除成功,但是數(shù)據(jù)庫(kù)更新失敗,那么,應(yīng)用再訪問(wèn)數(shù)據(jù)時(shí),緩存中沒有數(shù)據(jù),就會(huì)發(fā)生緩存缺失。然后,應(yīng)用再訪問(wèn)數(shù)據(jù)庫(kù),但是數(shù)據(jù)庫(kù)中的值為舊值,應(yīng)用就訪問(wèn)到舊值了。
我來(lái)舉個(gè)例子說(shuō)明一下,可以先看看下面的圖片

redis如何解決緩存不一致的問(wèn)題?

應(yīng)用要把數(shù)據(jù) X 的值從 10 更新為 3,先在 Redis 緩存中刪除了 X 的緩存值,但是更新數(shù)據(jù)庫(kù)卻失敗了。如果此時(shí)有其他并發(fā)的請(qǐng)求訪問(wèn) X,會(huì)發(fā)現(xiàn) Redis 中緩存缺失,緊接著,請(qǐng)求就會(huì)訪問(wèn)數(shù)據(jù)庫(kù),讀到的卻是舊值 10。
你可能會(huì)問(wèn),如果我們先更新數(shù)據(jù)庫(kù),再刪除緩存中的值,是不是就可以解決這個(gè)問(wèn)題呢?我們?cè)賮?lái)分析下。
如果應(yīng)用先完成了數(shù)據(jù)庫(kù)的更新,但是,在刪除緩存時(shí)失敗了,那么,數(shù)據(jù)庫(kù)中的值是新值,而緩存中的是舊值,這肯定是不一致的。這個(gè)時(shí)候,如果有其他的并發(fā)請(qǐng)求來(lái)訪問(wèn)數(shù)據(jù),按照正常的緩存訪問(wèn)流程,就會(huì)先在緩存中查詢,但此時(shí),就會(huì)讀到舊值了。
我還是借助一個(gè)例子來(lái)說(shuō)明一下。

redis如何解決緩存不一致的問(wèn)題?

應(yīng)用要把數(shù)據(jù) X 的值從 10 更新為 3,先成功更新了數(shù)據(jù)庫(kù),然后在 Redis 緩存中刪除 X 的緩存,但是這個(gè)操作卻失敗了,這個(gè)時(shí)候,數(shù)據(jù)庫(kù)中 X 的新值為 3,Redis 中的 X 的緩存值為 10,這肯定是不一致的。如果剛好此時(shí)有其他客戶端也發(fā)送請(qǐng)求訪問(wèn) X,會(huì)先在 Redis 中查詢,該客戶端會(huì)發(fā)現(xiàn)緩存命中,但是讀到的卻是舊值 10。

好了,到這里,我們可以看到,在更新數(shù)據(jù)庫(kù)和刪除緩存值的過(guò)程中,無(wú)論這兩個(gè)操作的執(zhí)行順序誰(shuí)先誰(shuí)后,只要有一個(gè)操作失敗了,就會(huì)導(dǎo)致客戶端讀取到舊值。我畫了下面這張表,總結(jié)了剛剛所說(shuō)的這兩種情況。

redis如何解決緩存不一致的問(wèn)題?

問(wèn)題發(fā)生的原因我們知道了,那該怎么解決呢?

如何解決數(shù)據(jù)不一致問(wèn)題?

首先,我給你介紹一種方法:重試機(jī)制。

具體來(lái)說(shuō),可以把要?jiǎng)h除的緩存值或者是要更新的數(shù)據(jù)庫(kù)值暫存到消息隊(duì)列中(例如使用 Kafka 消息隊(duì)列)。當(dāng)應(yīng)用沒有能夠成功地刪除緩存值或者是更新數(shù)據(jù)庫(kù)值時(shí),可以從消息隊(duì)列中重新讀取這些值,然后再次進(jìn)行刪除或更新。

如果能夠成功地刪除或更新,我們就要把這些值從消息隊(duì)列中去除,以免重復(fù)操作,此時(shí),我們也可以保證數(shù)據(jù)庫(kù)和緩存的數(shù)據(jù)一致了。否則的話,我們還需要再次進(jìn)行重試。如果重試超過(guò)的一定次數(shù),還是沒有成功,我們就需要向業(yè)務(wù)層發(fā)送報(bào)錯(cuò)信息了。

下圖顯示了先更新數(shù)據(jù)庫(kù),再刪除緩存值時(shí),如果緩存刪除失敗,再次重試后刪除成功的情況,你可以看下。

redis如何解決緩存不一致的問(wèn)題?

剛剛說(shuō)的是在更新數(shù)據(jù)庫(kù)和刪除緩存值的過(guò)程中,其中一個(gè)操作失敗的情況,實(shí)際上,即使這兩個(gè)操作第一次執(zhí)行時(shí)都沒有失敗,當(dāng)有大量并發(fā)請(qǐng)求時(shí),應(yīng)用還是有可能讀到不一致的數(shù)據(jù)。

同樣,我們按照不同的刪除和更新順序,分成兩種情況來(lái)看。在這兩種情況下,我們的解決方法也有所不同。

情況一:先刪除緩存,再更新數(shù)據(jù)庫(kù)。

假設(shè)線程 A 刪除緩存值后,還沒有來(lái)得及更新數(shù)據(jù)庫(kù)(比如說(shuō)有網(wǎng)絡(luò)延遲),線程 B 就開始讀取數(shù)據(jù)了,那么這個(gè)時(shí)候,線程 B 會(huì)發(fā)現(xiàn)緩存缺失,就只能去數(shù)據(jù)庫(kù)讀取。這會(huì)帶來(lái)兩個(gè)問(wèn)題:

  1. 線程 B 讀取到了舊值;
  2. 線程 B 是在緩存缺失的情況下讀取的數(shù)據(jù)庫(kù),所以,它還會(huì)把舊值寫入緩存,這可能會(huì)導(dǎo)致其他線程從緩存中讀到舊值。

等到線程 B 從數(shù)據(jù)庫(kù)讀取完數(shù)據(jù)、更新了緩存后,線程 A 才開始更新數(shù)據(jù)庫(kù),此時(shí),緩存中的數(shù)據(jù)是舊值,而數(shù)據(jù)庫(kù)中的是最新值,兩者就不一致了。

我用一張表來(lái)匯總下這種情況。
redis如何解決緩存不一致的問(wèn)題?

這該怎么辦呢?我來(lái)給你提供一種解決方案。

在線程 A 更新完數(shù)據(jù)庫(kù)值以后,我們可以讓它先 sleep 一小段時(shí)間,再進(jìn)行一次緩存刪除操作。

之所以要加上 sleep 的這段時(shí)間,就是為了讓線程 B 能夠先從數(shù)據(jù)庫(kù)讀取數(shù)據(jù),再把缺失的數(shù)據(jù)寫入緩存,然后,線程 A 再進(jìn)行刪除。所以,線程 A sleep 的時(shí)間,就需要大于線程 B 讀取數(shù)據(jù)再寫入緩存的時(shí)間。這個(gè)時(shí)間怎么確定呢?建議你在業(yè)務(wù)程序運(yùn)行的時(shí)候,統(tǒng)計(jì)下線程讀數(shù)據(jù)和寫緩存的操作時(shí)間,以此為基礎(chǔ)來(lái)進(jìn)行估算。

這樣一來(lái),其它線程讀取數(shù)據(jù)時(shí),會(huì)發(fā)現(xiàn)緩存缺失,所以會(huì)從數(shù)據(jù)庫(kù)中讀取最新值。因?yàn)檫@個(gè)方案會(huì)在第一次刪除緩存值后,延遲一段時(shí)間再次進(jìn)行刪除,所以我們也把它叫做“延遲雙刪”。

下面的這段偽代碼就是“延遲雙刪”方案的示例,你可以看下。

redis.delKey(X) db.update(X) Thread.sleep(N) redis.delKey(X)

情況二:先更新數(shù)據(jù)庫(kù)值,再刪除緩存值。

如果線程 A 刪除了數(shù)據(jù)庫(kù)中的值,但還沒來(lái)得及刪除緩存值,線程 B 就開始讀取數(shù)據(jù)了,那么此時(shí),線程 B 查詢緩存時(shí),發(fā)現(xiàn)緩存命中,就會(huì)直接從緩存中讀取舊值。不過(guò),在這種情況下,如果其他線程并發(fā)讀緩存的請(qǐng)求不多,那么,就不會(huì)有很多請(qǐng)求讀取到舊值。而且,線程 A 一般也會(huì)很快刪除緩存值,這樣一來(lái),其他線程再次讀取時(shí),就會(huì)發(fā)生緩存缺失,進(jìn)而從數(shù)據(jù)庫(kù)中讀取最新值。所以,這種情況對(duì)業(yè)務(wù)的影響較小。

我再畫一張表,帶你總結(jié)下先更新數(shù)據(jù)庫(kù)、再刪除緩存值的情況。
redis如何解決緩存不一致的問(wèn)題?

好了,到這里,我們了解到了,緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)不一致一般是由兩個(gè)原因?qū)е碌?,我給你提供了相應(yīng)的解決方案。

  • 刪除緩存值或更新數(shù)據(jù)庫(kù)失敗而導(dǎo)致數(shù)據(jù)不一致,你可以使用重試機(jī)制確保刪除或更新操作成功。
  • 在刪除緩存值、更新數(shù)據(jù)庫(kù)的這兩步操作中,有其他線程的并發(fā)讀操作,導(dǎo)致其他線程讀取到舊值,應(yīng)對(duì)方案是延遲雙刪。

推薦學(xué)習(xí):Redis視頻教程

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
国产婷婷精品| 日韩国产一区二区三区| 国产亚洲激情| 国产91精品对白在线播放| 激情黄产视频在线免费观看| 国产91在线播放精品| 精品五月天堂| 日韩在线看片| 欧洲毛片在线视频免费观看| 亚洲激情中文在线| 中文亚洲欧美| 视频一区二区三区在线| 亚洲视频二区| 国产麻豆一区二区三区精品视频| 日韩精品91亚洲二区在线观看| 石原莉奈在线亚洲二区| 亚洲精品在线二区| 国产欧美高清| 福利在线一区| 亚洲福利一区| 亚洲免费资源| 麻豆国产欧美一区二区三区 | 蜜臀精品一区二区三区在线观看 | 欧美日韩午夜电影网| 国产精品网址| 亚洲1234区| 亚洲免费中文| 国产亚洲精品美女久久久久久久久久| 另类综合日韩欧美亚洲| 久久精品高清| 日欧美一区二区| 国产伊人久久| 伊人影院久久| 国产麻豆精品| 999精品在线| 中文字幕免费精品| 麻豆91在线播放| 在线精品小视频| 91欧美极品| 天堂8中文在线最新版在线| 99re国产精品| 国产伦精品一区二区三区在线播放| 黄色精品视频| 日本欧美在线看| 久久久精品国产**网站| 欧美日一区二区| 97久久亚洲| 日韩精品专区| 日韩av三区| 久久久影院免费| 欧美一区精品| 激情婷婷综合| 国产精品一区二区精品 | 黄色日韩精品| 国产欧美日韩视频在线| 99久久99视频只有精品| 日本在线视频一区二区| 蜜桃视频在线网站| 日本中文字幕不卡| 亚洲一级高清| 国产精品久久乐| 欧美久久精品一级c片| 国产美女撒尿一区二区| 免费观看久久av| 美女久久久久久 | 国产一区2区| 在线看片一区| 91精品国产91久久久久久黑人| 天海翼亚洲一区二区三区| 日韩免费在线| 国产三级精品三级在线观看国产| 欧美日韩国产高清| 精品国产a一区二区三区v免费| 亚洲免费影视| 亚洲黄色网址| 国产乱人伦精品一区| 日韩午夜一区| 日本久久成人网| 久久99免费视频| 免费在线观看成人| 久久精品免费一区二区三区| 美女视频黄 久久| 日本va欧美va精品发布| 国产午夜精品一区二区三区欧美 | 日韩精品一页| 91精品成人| 91偷拍一区二区三区精品| 日本天堂一区| 一级欧美视频| 在线一区免费| 久久久久一区| 精品国产一区二区三区av片| 亚州精品视频| 先锋亚洲精品| 伊人影院久久| 999久久久免费精品国产| 麻豆传媒一区二区三区| 欧美综合精品| 日本中文字幕一区二区| 丝瓜av网站精品一区二区 | 免费视频久久| 午夜亚洲福利| 免费在线观看成人| 欧美日韩国产高清| 日韩久久一区二区三区| 国产一区二区三区四区| 久久av影院| 国产精品一国产精品k频道56| 亚洲欧美久久精品| 一区二区电影在线观看| 久久高清一区| 中文精品视频| 亚洲深夜影院| 午夜久久一区| 蜜桃一区二区三区| 美女久久久久| 国产亚洲一级| 99热精品在线| 好看的亚洲午夜视频在线| 91中文字幕精品永久在线| 四季av一区二区凹凸精品| 国产成人精品一区二区三区视频| 精品国产午夜肉伦伦影院| 久久精品国产久精国产| 麻豆精品新av中文字幕| 久久丁香四色| 色婷婷色综合| 日韩欧美一区二区三区免费观看| 神马久久午夜| 亚洲v在线看| 午夜精品影院| 快she精品国产999| 亚洲精品日本| 欧美亚洲人成在线| 国产精品久久久久久久久免费高清 | 美女av一区| 国产成人调教视频在线观看| 欧美日韩国产v| 亚洲男女av一区二区| 中文一区二区| 日韩一区网站| 国产欧美自拍| 福利一区二区三区视频在线观看| 青青青免费在线视频| 亚洲综合在线电影| 亚洲电影在线一区二区三区| 国产视频亚洲| 亚欧洲精品视频在线观看| 久久精品999| 成人台湾亚洲精品一区二区| 久久精品1区| aa亚洲婷婷| 日本中文字幕一区二区视频| 国产另类在线| 久久婷婷激情| 亚洲精品动态| 欧美激情99| 日韩一区电影| 亚洲一级淫片| 欧美极品一区二区三区| 欧美一区二区三区激情视频| 亚洲人成网站在线在线观看| 国产精品1区| 亚洲天堂久久| 日韩精品第一| 国产成人精品亚洲日本在线观看| 麻豆亚洲精品| 久久亚洲精精品中文字幕| 国产99久久| 青青草国产精品亚洲专区无| 97精品国产一区二区三区| 伊人久久婷婷| 国产欧美视频在线| 欧美一区二区三区高清视频| 日本一区中文字幕| 国产 日韩 欧美一区| 日韩毛片一区| av高清一区| 青青草伊人久久| 久久九九电影| 国产精品亚洲四区在线观看| 神马午夜久久| 欧美另类中文字幕| 欧美色图一区| 国产欧美丝祙| 国产一区欧美| 欧美另类中文字幕| 久久精品高清| 国产精品久久久久久模特 | 美女网站视频一区| 日韩av在线免费观看不卡| 吉吉日韩欧美| 亚州精品视频| 久久久成人网| 国产日韩一区二区三免费高清| 久久久夜精品| 国产精品高清一区二区| 亚洲精品电影| 麻豆免费精品视频| 免费精品视频|