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

站長資訊網
最全最豐富的資訊網站

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

本篇文章給大家帶來了關于Redis如何解決緩存不一致的問題,緩存和數據庫的數據不一致是如何發生的,下面就一起來看一下吧,希望對大家有幫助。

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

推薦學習:Redis學習教程

緩存和數據庫的數據不一致是如何發生的?

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

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

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

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

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

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

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

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

下面我們再來說說只讀緩存。對于只讀緩存來說,如果有數據新增,會直接寫入數據庫;而有數據刪改時,就需要把只讀緩存中的數據標記為無效。這樣一來,應用后續再訪問這些增刪改的數據時,因為緩存中沒有相應的數據,就會發生緩存缺失。此時,應用再從數據庫中把數據讀入緩存,這樣后續再訪問數據時,就能夠直接從緩存中讀取了。

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

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

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

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

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

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

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

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

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

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

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

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

如何解決數據不一致問題?

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

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

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

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

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

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

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

情況一:先刪除緩存,再更新數據庫。

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

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

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

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

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

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

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

這樣一來,其它線程讀取數據時,會發現緩存缺失,所以會從數據庫中讀取最新值。因為這個方案會在第一次刪除緩存值后,延遲一段時間再次進行刪除,所以我們也把它叫做“延遲雙刪”。

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

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

情況二:先更新數據庫值,再刪除緩存值。

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

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

好了,到這里,我們了解到了,緩存和數據庫的數據不一致一般是由兩個原因導致的,我給你提供了相應的解決方案。

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

推薦學習:Redis視頻教程

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
婷婷丁香六月激情综合啪 | 久久人人妻人人爽人人爽| 久久高清内射无套| 蜜臀av午夜福利| 人妻少妇精品视频三区二区一区| 日产乱码一二三区别免费观看| 少妇性XXXXXXXXX色野| 新CHINESE无套小帅KTV| 亚洲乱亚洲乱少妇无码| 中文字幕AV无码一区二区蜜芽三| 939W78W78W乳液特色| 波多野结衣AV一区二区全免费观| 国产成人亚洲综合| 精品不卡一区二区| 免费观看交性大片| 日产亚洲一区二区三区| 亚洲AV成人噜噜无码网站| 伊人久久大香线焦AV色| А√天堂资源中文在线官网| 国产成人亚洲精品无码H| 激情综合一区二区三区| 男女裸交免费无遮挡全过程| 少妇人妻在线视频| 亚洲国模337P人艺体艺术| 综合无码一区二区三区| 公侵犯人妻一区二区三区免费| 国产无人区卡一卡二卡乱码| 久久久亚洲欧洲日产国码AⅤ| 强壮公弄得我次次高潮| 无码专区国产精品第一页| 一本大道无码人妻精品专区| 锕锕锕锕锕锕好爽视频软件| 国产精品老熟女露脸视频| 久久久久亚洲AV成人人电影软件 | 99久久人妻无码中文字幕系列| 寡妇好丰满奶好大| 久久6久久66热这里只是精品| 欧美乱大交XXXXX性喷潮| 无码精品人妻一区二区三区ap| 亚洲自偷图片自拍图片| 菠萝蜜国际通道一区麻豆| 国产在线 | 传媒麻豆| 女角色翻白眼流口水流眼泪图片| 偷窥@MADSEXTUBE| 岳今晚让我玩个够肥水一体探岳体 | 好男人好资源神马在线观看| 农村人乱弄一区二区| 无码人妻久久久一区二区三区| 影音先锋手机AV资源站| 国产成人久久精品二区三区小说| 久久久噜噜噜久久熟女| 十八18禁国产精品WWW| 一本一道AV中文字幕无码| 丰满少妇被猛烈进出69影院| 久久久久99精品成人品| 少妇伦子伦精品无码STYLES| 永久免费精品精品永久-夜色| 国产AV一区二区三区传媒| 老外又长又大插的太深了| 天天摸日日摸狠狠添高潮喷| 中国熟妇人妻XXXXX中文| 国产好大好硬好爽免费不卡| 美女高潮无套内谢| 羞羞麻豆国产精品1区2区3区| 50妺妺窝人体色WWW在线| 国产日产久久高清欧美一区| 人妻[21P]大胆| 亚洲中文字幕无码人在线| 国产精成人品日日拍夜夜免费| 女角色翻白眼流口水流眼泪图片| 亚洲产国偷v产偷v自拍浪潮AV| 拔萝卜在线视频免费观看| 久久精品国产99精品国产亚洲性| 少女たちよ在线观看动漫4集免费| 中文字幕人妻一区二区三区| 韩国善良的小峓子在钱| 色欲AV蜜臀AV在线观看麻豆| 337P粉嫩胞人体高清视频免费 | 亚洲国产AⅤ精品一区二区百度 | 大伊香蕉在线精品视频75| 麻豆人妻少妇精品无码专区| 亚洲AV无码二区一区二十六区| 被按摩的人妻中文字幕| 麻豆视传媒官方直接进入| 亚洲成在人线AV品善网好看| 丰满熟妇大号BBWBBWBBW| 欧美超级乱婬视频播放| 亚洲伊人五月丁香激情| 国产亚洲美女精品久久久久 | 国产成人亚洲综合无码99| 强开少妇嫩苞又嫩又紧小说| 一二三四电影在线观看视频播放免| 国产日产久久高清欧美一区| 色欲麻豆国产福利精品| YYYY11111少妇无码影院| 美女张开腿黄网站免费| 亚洲无人区码一码二码三码的特点| 国产色无码精品视频国产| 贪婪洞窟H5双修流攻略小说| 爆乳2把你榨干哦OVA在线观看 | 99久久精品国产免费看| 老熟女另类XXX精品视频| 亚洲女毛多水多21P| 国产特级毛片AAAAAAA高清| 少妇内射一区27p| 差差差很疼免费软件APP下载| 女性の乳頭を遮住する方法 | 亚洲精品国产成人99久久6| 国产免费久久精品国产传媒| 天天摸夜夜摸夜夜狠狠摸| 成人亚洲A片Ⅴ一区二区小说| 欧美日韩一区二区三区人妻| 1000部啪啪未满十八勿入不卡| 久久人妻无码一区二区三区av| 亚洲乱码无人区卡1卡2卡3 | 国产成年无码久久久久下载 | 男女性色大片免费网站| 在教室伦流澡到高潮H强圩| 久久久久亚洲AV无码专| 亚洲一区二区三区自拍公司| 精品无码人妻一区二区三区18| 亚洲—本道 在线无码AV发| 韩漫无遮漫画全集观看| 亚洲AV日韩AV无码大全| 国产无套粉嫩白浆在线| 午夜无码免费福利视频网址| 国产美女高潮流白浆视频 | 人人爽人人澡人人人妻百度 | 国外免费B2B网站| 亚洲丰满性熟妇PⅩXXOO| 激情影院内射美女| 亚洲成在人线AV| 精品无码黑人又粗又大又长| 亚洲一区二区三区乱码AⅤ蜜桃| 久久精品国产精品国产一区| 艳妇乳肉豪妇荡乳在线观看| 久久一本加勒比波多野结衣| 在线观看片免费人成视频无码| 美女露 0的奶头无| BDB14黑人巨大视频| 人妻少妇波多野结衣黑人| 成人亚洲综合AV天堂| 四虎最新在线永久免费| 国产精品一区二区AV麻豆| 亚洲AV无码成H人动漫无遮挡 | 欧美一性一交一免费看| ワンピースのエロ官网| 日日摸日日碰夜夜爽无码| 国产ww又大又粗又刺激孕妇| 无码一区二区三区AV免费 | 亚洲香蕉成人AAAV在线网站| 麻豆亚洲AV永久无码精品久久| 99久E在线精品视频在线| 日本老熟妇毛茸茸| 国产精品99久久99久久久动漫| 亚洲 欧美 激情 小说 另类| 精品人妻系列无码一区二区三区| 野花社区高清在线观看视频| 男生坤坤放在女生坤坤叫什么| 被男人吃奶很爽的毛片| 透明奶罩的邻居三级在线观看| 国产在线视频 | 传媒| 亚洲熟妇AV一区二区三区漫画| 麻豆av无码人妻一区二区三区| JEALOUSVUE成熟MON| 少妇午夜啪爽嗷嗷叫视频| 好男人视频在线观看| 又色又爽又黄又无遮挡网站| 人妻跪趴高撅肥臀| 国产精品国产三级欧美二区| 亚洲顶级裸体AV片| 免费久久99精品国产自在现| 成人性欧美丨区二区三区| 亚洲AV噜噜在线成人网站女同 | 色AV综合AV无码AV网站| 国产午夜无码视频在线观看| 夜里18款禁用B站入口探APP| 青青草A免费线观A| 国产精品亚洲综合网熟女| 一女三黑人玩4P惨叫| 日本精产国品一二三产品区别| 国产日产欧产精品精品推荐免费| 亚洲熟妇AV一区二区三区浪潮| 欧美性猛交XXXX乱大交3| 国产精品三级一区二区| 野花免费观看日本电视剧| 人人人妻人人澡人人爽欧美一区 | 亚洲 欧洲 日产 经典| 免费高清中文字幕MV| 东北粗壮熟女丰满高潮| 亚洲精品无码久久久久去Q| 欧美性猛尖ⅩⅩⅩⅩ乱大交| 国产三级A三级三级| 中文字幕无码人妻少妇免费| 天堂√在线中文官网在线| 久久久久人妻精品一区蜜桃 | 精品久久久无码专区中文字幕| JAPANESETUBE日本护士高潮| 亚洲AV乱码一区二区三区在线观看| 妺妺窝人体色WWW国产馆在线|