數(shù)據(jù)庫(kù)和Redis如何保持強(qiáng)一致性,這篇文章告訴你
目的
Redis和Msql來(lái)保持?jǐn)?shù)據(jù)同步,并且強(qiáng)一致,以此來(lái)提高對(duì)應(yīng)接口的響應(yīng)速度,剛開(kāi)始考慮是用mybatis的二級(jí)緩存,發(fā)現(xiàn)坑不少,于是決定自己搞
要關(guān)注的問(wèn)題點(diǎn)
操作數(shù)據(jù)必須是唯一索引
如果更新數(shù)據(jù)不是唯一索引,則數(shù)據(jù)庫(kù)更新后的值,與緩存不一致,而查詢(xún)還會(huì)走緩存,而查詢(xún)的值是臟值。
查詢(xún)唯一數(shù)據(jù),數(shù)據(jù)值必須是全部字段
假如:B交易查詢(xún)字段不是全部字段,進(jìn)行查詢(xún)放入緩存,A交易進(jìn)行查詢(xún)時(shí),從緩存獲取,由于A(yíng)交易需要全部字段,所以就會(huì)出現(xiàn)不可預(yù)知的問(wèn)題。
查詢(xún)緩存數(shù)據(jù)后,必須要在程序中再次進(jìn)行條件判斷
因?yàn)樵趓edis中,存儲(chǔ)的的key是唯一索引,所以當(dāng)查詢(xún)數(shù)據(jù)后,只會(huì)命中唯一索引的數(shù)據(jù),其他附帶查詢(xún)條件不生效。
例如:唯一索引為:user_id
,那么執(zhí)行select * from t_user_auth_info where user_id=‘111’ and user_level=‘1’
是,條件user_level是不會(huì)生效
高并發(fā)場(chǎng)景下要注意臟數(shù)據(jù)的控制
假設(shè)是以上流程圖,在更新操作,第一步刪除緩存后,線(xiàn)程切換到查詢(xún)線(xiàn)程,查詢(xún)操作判斷緩存中沒(méi)有數(shù)據(jù),就會(huì)查詢(xún)數(shù)據(jù)庫(kù),并把數(shù)據(jù)存入到緩存中,這時(shí)線(xiàn)程在切換到更新線(xiàn)程,進(jìn)行數(shù)據(jù)庫(kù)的更新,這會(huì)就會(huì)造成,數(shù)據(jù)庫(kù)的數(shù)據(jù)與緩存有不一致性。
最終方案
基于以上問(wèn)題,我們的最終流程圖如下
以上流程圖在進(jìn)行更新操作時(shí),增加刪除緩存lock,如果這會(huì)查詢(xún)操作判斷緩存中有數(shù)據(jù),就直接返回?cái)?shù)據(jù),如果沒(méi)有再次判斷有沒(méi)有存在刪除緩存lock,如果有則走數(shù)據(jù)庫(kù)查詢(xún),并返回,不放入緩存,如果沒(méi)有則查詢(xún)數(shù)據(jù)庫(kù),并放入緩存,并返回。
注意: 登記緩存標(biāo)識(shí)時(shí),增加緩存lock失效時(shí)間,因?yàn)橛锌赡軇h除緩存和數(shù)據(jù)庫(kù)更新成功了,而刪除緩存lock失敗了,那這樣后續(xù)查詢(xún)就都走數(shù)據(jù)庫(kù)了,這個(gè)方案就失去意義了。
代碼實(shí)現(xiàn)方案
通過(guò)aop對(duì)db的操作方法,進(jìn)行攔截,查詢(xún)方法采用一個(gè)切面,刪除和更新方法采用一個(gè)切面,然后再按照以上流程進(jìn)行編寫(xiě),我們這邊是使用框架進(jìn)行封裝,最后只需要開(kāi)發(fā)人員配置以下xml即可文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-746980.html
<cache-config>
<cache-entity po="com.demo.po.AuthUser" key-prefix="SYSTEM_Person" po-throws="true" key-expire="" key-expire-time-unit="">
<key-properties>userId</key-properties>
</cache-entity>
</cache-config>
掃描下面的二維碼關(guān)注我們的微信公眾帳號(hào),在微信公眾帳號(hào)中回復(fù)?加群?即可加入到我們的技術(shù)討論群里面共同學(xué)習(xí)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-746980.html
到了這里,關(guān)于生產(chǎn)實(shí)踐:Redis與Mysql的數(shù)據(jù)強(qiáng)一致性方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!