成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

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

redis如何解決緩存不一致的問題?

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

redis如何解決緩存不一致的問題?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

redis如何解決緩存不一致的問題?

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

redis如何解決緩存不一致的問題?

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

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

redis如何解決緩存不一致的問題?

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

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

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

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

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

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

redis如何解決緩存不一致的問題?

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

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

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

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

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

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

我用一張表來匯總下這種情況。
redis如何解決緩存不一致的問題?

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

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

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

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

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

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

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

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

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

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

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

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

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
奶头被客人玩的又红又肿| 久久久AV波多野一区二区| 国产裸拍裸体女网站链接在线观看| 色综合视频一区二区三区| 色欲天天综合亚洲日本| 无码中文字幕人妻在线一区| 亚洲AⅤ无码牛牛影视| 亚洲精品卡2卡三卡4卡2卡乱码 | 亚洲熟妇无码乱子AⅤ电影| 一二三四免费观看在线视频| AV无码欧洲亚洲电影网| 东北老熟女疯狂作爱视频| 国产欧美日韩一区二区三区在线| 精品国产制服丝袜高跟 | 中文字幕亚洲欧美日韩在线不卡| C她下嫩B视频内射国产| 国产H视频在线观看| 99久久国语露脸精品国产色| 成人无码A区在线观看视频| 国产女主播喷水视频在线观看| 久久精品人人爽人人爽| 轻点灬大JI巴大粗长了视频| 无码AⅤ精品一区二区三区浪潮| 亚洲妇女水蜜桃AV网网站| 40岁大乳的熟妇在线观看| 岛国精品一区免费视频在线观看| 国产一区二区精品久久岳| 久久先锋男人AV资源网站| 人人插人人操人人射av网| 无码人妻精品一区二区三区9厂| 亚洲人成色77777在线观看大| 99精品国产在热久久婷婷| 国产成人乱色伦区| 久久精品亚洲中文字幕无码网站| 强壮公的侵犯让我高潮不断| 午夜精品无人区乱码1区2区| 一本一道VS无码中文字幕| 本道久久综合无码中文字幕| 含羞草四叶草三叶草| 欧美乱大交XXXXX| 亚州少妇无套内射激情视频| 中文字幕久久精品无码| 国产成人A码男人的天堂| 久久久久亚洲AV片无码| 日韩一区在线视频| 亚洲综合一区无码精品| 方辰苏婉儿是哪本小说的主角| 黑人大战亚洲人精品一区| 欧美妆和日韩妆区别777CCC| 亚洲AV无码国产一区二区三区四| AV无码免费无禁网站| 狠狠色丁香久久婷婷综合_中| 妺妺晚上扒我内裤吃我精子 | 国产偷久久久精品专区| 免费人成在线观看视频无码| 无码专区一ⅤA亚洲V专区在线| 祖母和おばあちゃん的区别| 国产美足白丝榨精在线观看sm| 男男腐啪GⅤ小受无套进入| 小浪蹄子蜜水噗呲噗呲的| 无码专区国产精品第一页| 中文字幕人妻无码一夲道| 国产精品一区二区在线观看| 农村人乱弄一区二区的处罚方式| 亚洲AV成人片无码网站网| 啊哈~给我~啊(H)| 久久AV无码AV高潮AV| 忘忧草社区在线影视| A级大胆欧美人体大胆666| 精品国内自产拍在线观看视频| 色噜噜狠狠狠狠色综合久一| 中文无码人妻影音先锋| 国产做出在线 | 传媒麻豆| 日本熟妇在线一区二区三区| 一区二区三区国产精华液区别 | 免费无码又爽又刺激毛片| 亚洲AV无码成H人动漫无遮挡| 伴郎粗大的内捧猛烈进出视频观看 | 性丰满ⅩXXOOOZZXXHD| 办公室的秘密2中文字幕| 军人全身脱精光自慰| 亚洲AV无码成人精品区在线欢看| 成色好的Y31S标准版| 内射人妻无码色AV综合网| 亚洲乱码AV一区二区| 国产精品IGAO视频网网址| 人与各种动ZZZ0O0OXXX| 中文字幕一区二区三区精彩视频 | 亚洲春色CAMELTOE一区| 国产精品SP调教打屁股| 人人妻人人澡人人爽人人精品图片 | 国产作爱视频免费播放| 少妇ⅩXXOOOZZXXHD| SEERX性欧美| 免费看国产曰批40分钟| 亚洲熟妇AV一区二区三区浪潮| 国产精品香蕉成人网在线观看| 日韩AV片无码一区二区三区不卡 | 国产精品亚洲精品日韩已满| 入睡指南PO高干粟熹沉芙| ASS年轻少妇PIC精品| 乱肉怀孕又粗又大| 亚洲丁香婷婷久久一区二区| 国产老妇女婬片A级毛片| 色偷偷久久一区二区三区| 啊轻点灬大JI巴太粗太长了H文| 门徒电影高清完整版在线观看| 亚洲熟妇AV一区二区三区| 黑人巨茎大战白人女40CM| 香港A级毛片经典免费观看| 国产成人无码区免费内射一片色欲 | 无码H肉3D动漫在线观看| 丰满亚洲大尺度无码无码专线| 人人超人人超碰超国产| 99久久久精品免费观看国产| 妺妺窝人体色WWW网站厕所盗摄| 又粗又大又硬又爽的少妇毛片 | 亚洲亚洲人成综合网络| 精品无码人妻一区二区三区不卡| 亚洲AV无码国产一区二区三区| 国产午夜精品一区二区三区极品 | 日韩欧美人妻在线| 边做边爱完整版免费视频播放 | 欧美白人乱大交XXXX潮喷| 18禁无遮拦无码国产在线播放| 猫咪成人网站WWW永久网站| 找老女人泻火对白自拍| 美丽人妻被按摩中出中文字幕| 中国OLDWOMAN老熟妇| 久久综合久久鬼色| 中国女人内射6XXXXXWWW| 免费观看A级毛片| 99久久无色码中文字幕人妻| 欧美性猛烈XXXX极品少妇 | 韩国AV一区二区| 亚洲精品TV久久久久久久久| 精品无码乱码AV| 一面膜上边一面膜下边韩国| 免费观看国产小粉嫩喷水精品午| 综合无码精品人妻一区二区三区 | 国内精品久久久人妻中文字幕| 亚洲AV无码乱码在线观看富二代| 狠狠色噜噜狠狠亚洲AV| 亚洲色精品一区二区三区 | 在线观看ww亚洲精品| 男女性高爱潮是免费国产| JEANASIS日本| 色综合热无码热国产| 国产乱码日产精品BD| 亚洲AV永久无码精品放毛片一| 精品人妻一区二区三区Av| 一本一道久久综合久久| 欧美激情在线播放| 餐桌下手指噗呲噗呲| 婷婷成人小说综合专区| 国精产品一区二区三区有限公司| 亚洲国产AⅤ精品一区二区蜜桃| 久久精品无码一区二区无码 | 影音先锋人妻啪啪AV资源网站| 男人女人免费啪啪观看| 成 人 免 费 黄 色| 无码夫の前で人妻を犯す| 护士被两个病人伦奷日出白浆| 永久黄网站色视频免费直播| 轻点灬大JI巴大粗长了视频| 国产成人午夜性A一级毛片老女人 国产成人午夜无码电影在线观看 国产成人午夜精品影院 | 末成年女AV片一区二区丫| 成人免费区一区二区三区| 午夜理论片YY44880影院| 久久久久AV综合网成人| FREE性欧美╳╳╳HD| 婷婷精品国产亚洲AV麻豆不片| 精品国产免费第一区二区三区 | 亚洲永久精品wW4791一区| 欧美乱子YELLOWVIDEO| 国产V综合V亚洲欧| 亚洲精品无码AV片| 欧美丰满多毛少妇XXXXX性| 丰满人妻无码AⅤ一区二区| 亚洲S久久久久一区二区| 妺妺窝人体色WWW婷婷| 国产成 人 在线观看 亚洲| 亚洲美女高潮久久久久| 欧美熟妇呻吟猛交XX性| 国产精品无码不卡一区二区三区 | 城中村快餐嫖老妇对白| 亚洲第一狼人伊人AV| 女生裙子里面到底穿了啥| 国产大屁股视频免费区| 伊人精品久久久久7777| 色噜噜久久综合伊人一本| 精品国产一区二区三区不卡在线| 99精品国产再热久久无毒不卡| 无码人妻aⅴ一区二区三区99| 狼人无码精华AV午夜精品| 各种女BBWBBWBBW么| 夜里十大禁用APP软件最新章节| 骚片AV蜜桃精品一区| 久久人人爽人人爽人人片AV超碰| 东北小伙二十厘米粗大硬|