Redis的作用
一般情況下Redis是用來實現(xiàn)應(yīng)用和數(shù)據(jù)庫之間的一個讀操作的緩存層,主要目的是減少數(shù)據(jù)庫的io,還可以提升數(shù)據(jù)庫io性能
方法一:
先更新MySQL數(shù)據(jù)庫,再刪除緩存,再從數(shù)據(jù)庫查詢到的最新的數(shù)據(jù)同步到redis。采用最終一致性性策略。
缺點:相較于mq的方式,這種方式由于要查數(shù)據(jù)庫并將最新數(shù)據(jù)寫到redis,可能會造成接口響應(yīng)速度變慢。
方法二:
更新mysql數(shù)據(jù)庫,再采用mq異步的方式,將數(shù)據(jù)同步到redis中。
缺點:數(shù)據(jù)同步延時概率比較大,數(shù)據(jù)庫的更改信息投遞到mq中,消費者可能沒來得及消費消息同步數(shù)據(jù)到redis。
優(yōu)點:異步解耦
方法三:
基于訂閱mysql binlog,采用mq異步的形式將數(shù)據(jù)同步到redis(canal框架)。
將mysql以主從的方式部署,主庫負(fù)責(zé)寫,從庫負(fù)責(zé)讀,當(dāng)主庫的binlog日志文件發(fā)生改變時,將信息同步到從庫,從庫執(zhí)行對應(yīng)的sql,保證主從一致性。
canalServer端,偽裝成mysql的從節(jié)點,訂閱mysql主節(jié)點的binlog文件,當(dāng)主節(jié)點的binlog發(fā)生變化時,會將binlog日志文件發(fā)送給canalServer端,自己創(chuàng)建的處理程序連接到canalServer端,將數(shù)據(jù)同步到redis。
優(yōu)點:手動直接更改數(shù)據(jù)庫也會自動同步到redis。
方法四:
延時雙刪策略(不推薦)
- 先刪緩存,在更新mysql并同步到redis,在高并發(fā)的情況下,第一個線程還沒來得及更新mysql時,其他線程讀取到的緩存可能為null值,將mysql舊的數(shù)據(jù)同步到redis中了。
解決辦法:延時刪除,在t1線程更新數(shù)據(jù)庫之后,sleep一段時間再去刪除緩存。
缺點:t1線程延時多少秒再去刪除緩存中的key?難以控制,得根據(jù)業(yè)務(wù)邏輯的執(zhí)行時間和寫緩存的時間來進(jìn)行估算。
補(bǔ)充:什么是雙寫一致性協(xié)議?
先更新數(shù)據(jù)庫,在更新緩存。
updateDB();
updateredis();
多個線程同步修改mysql和redis時,由于mysql行鎖機(jī)制,多個線程同時修改同一行數(shù)據(jù),只能有一個線程修改成功,兩個線程更新完數(shù)據(jù)庫后同時更新redis,由于不能確保兩個線程更新緩存的先后順序,可能會造成數(shù)據(jù)庫和緩存的不一致性。文章來源:http://www.zghlxwxcb.cn/news/detail-730509.html
解決辦法:使用事務(wù)保證更新數(shù)據(jù)庫和更新緩存整個兩個操作的原子性。文章來源地址http://www.zghlxwxcb.cn/news/detail-730509.html
到了這里,關(guān)于【Redis】Redis做為緩存,MySQL如何與Redis保持?jǐn)?shù)據(jù)一致的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!