大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 Redis與數(shù)據(jù)庫同步問題的解決

Redis與數(shù)據(jù)庫同步問題的解決

更新時間:2022-12-21 11:17:18 來源:動力節(jié)點(diǎn) 瀏覽1178次

大家在學(xué)習(xí)Java的時候都會學(xué)到Redis教程,下面我們來了解一下Redis與數(shù)據(jù)庫同步問題的解決方法。

緩存充當(dāng)數(shù)據(jù)庫

比如說Session這種訪問非常頻繁的數(shù)據(jù),就適合采用這種方案;當(dāng)然了,既然沒有涉及到數(shù)據(jù)庫,那么也就不會存在一致性問題;

緩存充當(dāng)數(shù)據(jù)庫熱點(diǎn)緩存

讀操作

目前的讀操作有個固定的套路,如下:

客戶端請求服務(wù)器的時候,發(fā)現(xiàn)如果服務(wù)器的緩存中存在,則直接取服務(wù)器的;

如果緩存中不存在,則去請求數(shù)據(jù)庫,并且將數(shù)據(jù)庫計算出來的數(shù)據(jù)回填給緩存;

返回數(shù)據(jù)給客戶端;

寫操作

各種情況會導(dǎo)致數(shù)據(jù)庫和緩存出現(xiàn)不一致的情況,這就是緩存和數(shù)據(jù)庫的雙寫一致性問題;

目前緩存存在三種策略,分別是

Cache Aside 更新策略:同時更新緩存和數(shù)據(jù)庫;

Read/Write Through 更新策略:先更新緩存,緩存負(fù)責(zé)同步更新數(shù)據(jù)庫;

Write Behind Caching 更新策略:先更新緩存,緩存定時異步更新數(shù)據(jù)庫;

三種策略各有優(yōu)缺點(diǎn),可以根據(jù)業(yè)務(wù)場景使用;

Cache Aside 更新策略

該策略大概的流程就是請求過來時先從緩存中取,如果命中緩存的話,則直接返回讀取的數(shù)據(jù);相反如果沒有命中的話,接著會從數(shù)據(jù)庫中成功獲取到數(shù)據(jù)后,再去清除緩存中的數(shù)據(jù);具體流程圖如下:

但是以上在某些特殊的情況下是存在問題:

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

兩個線程在高并發(fā)的情況下就會可能出現(xiàn)數(shù)據(jù)臟讀的情況:

線程A執(zhí)行寫操作,成功更新數(shù)據(jù)庫;

線程B同樣執(zhí)行和線程A一樣的操作,但是在線程A執(zhí)行更新緩存的過程中,線程B更新了新的數(shù)據(jù)庫數(shù)據(jù)到緩存中;

線程A在線程B全部操作完成以后才將相對老的數(shù)據(jù)又更新到了緩存中;

問題2:先刪除緩存,后更新數(shù)據(jù)庫

同樣的,在高并發(fā)場景下同樣會出現(xiàn)臟讀的情況:

線程A成功刪除了緩存,等待更新數(shù)據(jù)庫;

線程B進(jìn)行讀操作,由于此時緩存已經(jīng)被刪除了,因此線程B重新從數(shù)據(jù)庫中獲取老的數(shù)據(jù)并且更新到了緩存中;

線程A在線程B完成了整個的讀操作以后,才更新數(shù)據(jù)庫,此時緩存中的數(shù)據(jù)依舊是老的數(shù)據(jù);

問題3:先更新數(shù)據(jù)庫,后刪除緩存

目前這是比較普遍的操作,即使它還是有可能會出現(xiàn)臟讀的情況:

線程A進(jìn)行讀操作,此時正好沒有命中緩存,接著請求數(shù)據(jù)庫;

線程B進(jìn)行寫操作,在線程A沒有從數(shù)據(jù)庫中獲取到數(shù)據(jù)之前,把數(shù)據(jù)寫入到數(shù)據(jù)庫中,并且還成功刪除了緩存;

線程A在線程B完成了整個的寫操作以后,才將相對老的數(shù)據(jù)更新到緩存中;

但是以上的情況比較不會出現(xiàn),這是因?yàn)樯鲜銮闆r需要滿足線程A的讀操作要慢于線程B的寫操作,但是在現(xiàn)實(shí)過程中,讀操作通常都是要快于寫操作得多的,但是為了避免發(fā)生以上的情況,通常都是要給緩存加上一個過期的時間;

但是設(shè)想一下,如果上面的刪除緩存失敗了怎么辦呢,這樣顯然會導(dǎo)致數(shù)據(jù)臟讀的情況,我覺得方案如下:

設(shè)置緩存的過期時間(必須要做);

提供一個保障重試機(jī)制,將哪些刪除失敗的key提供給消息隊列去消費(fèi);

從消息隊列取出這些key再次進(jìn)行刪除,失敗再次加入到消息隊列中,超過一定次數(shù)以上則人工介入;

但是以上情況需要在業(yè)務(wù)代碼中進(jìn)行操作,顯然得需要進(jìn)行解耦;

目前我們公司就是使用該方案,具體過程為在更新數(shù)據(jù)庫數(shù)據(jù)的時候,數(shù)據(jù)庫會以binlog日志的形式保存下來,通過canal開源軟件將binlog解析成程序語言可以解析的地步,接著訂閱程序獲取到這些數(shù)據(jù)以后,嘗試刪除緩存操作,如果操作失敗的話,則將其加入到消息隊列中,重復(fù)消費(fèi),當(dāng)刪除操作的失敗次數(shù)到達(dá)一定的次數(shù)以后,還是得人工介入。

Read/Write Through 更新策略

該模式下,程序只需要維護(hù)緩存即可,數(shù)據(jù)庫的同步工作交由緩存來同步更新;

該策略具體又分為兩種:

Read Through:在查詢的過程中更新緩存;

Write Through:在寫操作的過程中如果命中緩存,則直接更新緩存,數(shù)據(jù)庫則由緩存自己同步去更新;

Write Behind Caching 更新策略

該策略只更新緩存,不會立馬更新數(shù)據(jù)庫,只會在一定的時間異步的批量去操作數(shù)據(jù)庫;這樣的好處在于直接操作緩存,效率極高,并且操作數(shù)據(jù)是異步的,還可以將多次的操作數(shù)據(jù)庫語句合并到一個事務(wù)中一起提交,因此效率很客觀;

但是,該策略沒有辦法做到數(shù)據(jù)強(qiáng)一致性,并且實(shí)現(xiàn)邏輯相對是比較復(fù)雜的,因?yàn)樗枰_認(rèn)哪些是需要更新到數(shù)據(jù)庫的,哪些是僅僅想要存儲在緩存中的;

比較

目前通常使用的是第一種策略中的先更新數(shù)據(jù)庫,后更新緩存;其他的相較比起來實(shí)現(xiàn)都比較復(fù)雜;

最后想說的是,緩存本來就是為了犧牲強(qiáng)一致性來提高性能的,所以肯定會存在一定的延遲時間,我們只需要保證最終的數(shù)據(jù)一致性即可;

提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 在线 | 一区二区三区四区 | 亚洲特级aaaaaa毛片 | 99热亚洲| 日韩免费高清一级毛片在线 | 国产欧美一区二区成人影院 | 免费精品久久久视频 | 亚州欧美| 狠色狠狠色狠狠狠色综合久久 | 青青青手机视频 | 久久www免费人成_看片美女图 | 久草手机视频 | 国产成人精品男人的天堂网站 | 99热人人| 欧美精品亚洲精品日韩 | 亚洲国产精品久久久久久网站 | 精品特级一级毛片免费观看 | 久久一本| 一级毛片日韩 | 亚洲国产精品久久久久婷婷老年 | 久久精品欧美日韩精品 | 看全色黄大色大片免费久黄久 | 欧美亚洲国产色综合 | 成人免费网站视频www | 男女免费在线视频 | 免费国产黄线在线观看视频 | 欧美日本免费观看αv片 | 亚洲精品国产字幕久久vr | 亚洲短视频在线观看 | 一级毛片在线看在线播放 | 久久国产精品免费看 | 久久精品国产精品青草 | 青青影院一区二区免费视频 | 久久综合九色综合97伊人麻豆 | 欧美人一级淫片a免费播放 欧美人与zoxxxx另类9 | 天天干天天操天天透 | 五月激情丁香婷婷综合第九 | 免费爱爱的视频太爽了 | 亚洲天天综合网 | 国产成人亚洲综合无 | 欧美成人怡红院在线观看 | 亚洲人成毛片线播放 |