本篇文章給大家分享的是有關(guān)MySQL和redis 怎么實(shí)現(xiàn)數(shù)據(jù)同步,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
成都創(chuàng)新互聯(lián)公司專注于尖扎企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè),商城網(wǎng)站制作。尖扎網(wǎng)站建設(shè)公司,為尖扎等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站設(shè)計(jì),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
MySQL和Redis 數(shù)據(jù)同步解決方案總結(jié)
現(xiàn)在在中集E棧工作,最近在做一個(gè)Redis箱格信息數(shù)據(jù)同步到數(shù)據(jù)庫(kù)Mysql的功能。
自己想了想,也有大概方案。
1、隊(duì)列同步,變跟數(shù)據(jù)2份,使用消息隊(duì)列,一份給Redis消費(fèi),一份給Mysql消費(fèi)。
2、后臺(tái)定時(shí)任務(wù),定時(shí)刷新Redis中箱格信息到數(shù)據(jù)庫(kù)。
網(wǎng)上也到處找了下解決方案,發(fā)現(xiàn)這么個(gè)問(wèn)題,居然是天下一大抄,還抄的一字不差,我也抄吧。
方案一:
讀: 讀redis->沒(méi)有,讀mysql->把mysql數(shù)據(jù)寫(xiě)回redis
寫(xiě): 寫(xiě)mysql->成功,寫(xiě)redis。
就是讀的話,先讀Redis,Redis沒(méi)有再讀數(shù)據(jù)庫(kù),將數(shù)據(jù)庫(kù)中的數(shù)據(jù)放入Redis。
寫(xiě)(增刪改),先寫(xiě)數(shù)據(jù)庫(kù),然后寫(xiě)Redis。
可以對(duì)此稍微優(yōu)化,比如要求一致性高的數(shù)據(jù),從數(shù)據(jù)庫(kù)讀,比如金融,交易數(shù)據(jù)。不要求強(qiáng)一致性的從Reids中讀取。
方案二:
基于binlog使用mysql_udf_redis,將數(shù)據(jù)庫(kù)中的數(shù)據(jù)同步到Redis。
方案三:
基于MQ,也就是最上面想到的方式1。
方案四:
官方有個(gè)memcached的udf插件,如果不是那么強(qiáng)烈非要redis的話,也可以考慮
如果是我選擇2,順便推薦發(fā)下大神的廣告:http://coolshell.cn/articles/17416.html
方案五:
用POSTGRESQL 替代 Mysql +Redis.
各種方案弊端
但是上面的方案都有各自的弊端。
方案一,明顯對(duì)于數(shù)據(jù)量巨大,更新頻繁的數(shù)據(jù)寫(xiě)入無(wú)能為力。比如E棧終端的箱格,箱格數(shù)量巨大,每個(gè)箱格的變跟狀態(tài)又很頻繁,這樣很容易把數(shù)據(jù)庫(kù)寫(xiě)掛。
方案二,是使用的mysql的User Defined Function功能,mysql_udf_redis是有人實(shí)現(xiàn)的同步數(shù)據(jù)到Redis的功能,弊端:需要學(xué)習(xí)成本,而來(lái),第三方的插件不穩(wěn)定。
方案三:怎么保證到數(shù)據(jù)庫(kù)和到Redis中的狀態(tài)一致性。就是假設(shè)一條修改數(shù)據(jù),從隊(duì)列寫(xiě)入到Mysql成功,但是寫(xiě)入到Redis失敗,這種如何搞。還有就是需要一個(gè)消息隊(duì)列,使用第三方的比如Kafka,RabbitMq等來(lái)實(shí)現(xiàn),管理起來(lái)不方便,系統(tǒng)整體穩(wěn)定性不行,而且只是這么個(gè)比較小的箱格數(shù)據(jù)信息同步。有點(diǎn)殺雞用牛刀。
其他的方案:
訂閱key的變化進(jìn)行數(shù)據(jù)庫(kù)更新,寫(xiě)的時(shí)候?qū)?份,一份往Redis寫(xiě),一份是Redis數(shù)據(jù)的key網(wǎng)更新隊(duì)列(也可以直接Reids存)里寫(xiě),再寫(xiě)個(gè)定時(shí)程序從更新隊(duì)列里取時(shí)間,根據(jù)key取出Redis數(shù)據(jù)到Mysql.
這個(gè)方案,其實(shí)和其他的不一樣,弊端了,就是占用內(nèi)存大,因?yàn)樾枰S護(hù)一份更新隊(duì)列。
最后了,我上級(jí)是說(shuō)用定時(shí)任務(wù),刷Redis中的箱格狀態(tài)信息到數(shù)據(jù)庫(kù)。2W個(gè)終端,一個(gè)終端100個(gè)箱格,200W個(gè)箱格,首先是進(jìn)行狀態(tài)比對(duì),狀態(tài)不一致的放入集合,批量update數(shù)據(jù)庫(kù)。
其實(shí)也會(huì)有寫(xiě)小問(wèn)題,比如在比對(duì)的時(shí)候:
1、Redis中的箱格狀態(tài)變跟了,怎么辦?我們不可能在比對(duì)的時(shí)候鎖住Redis,200W次循環(huán),這段時(shí)間完全可能發(fā)生狀態(tài)變跟。
2、在比對(duì)的時(shí)候,有人更新了數(shù)據(jù)庫(kù),怎么辦?因?yàn)橛行┎僮魇强梢灾苯痈聰?shù)據(jù)庫(kù)的。比如更新箱格的layoutRow之類的信息。
以上就是MySQL和Redis 怎么實(shí)現(xiàn)數(shù)據(jù)同步,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。