溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL和Redis 怎么實現(xiàn)數(shù)據(jù)同步

發(fā)布時間:2020-09-23 09:31:21 來源:億速云 閱讀:385 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關(guān)MySQLRedis 怎么實現(xiàn)數(shù)據(jù)同步,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

MySQL和Redis 數(shù)據(jù)同步解決方案總結(jié)

現(xiàn)在在中集E棧工作,最近在做一個Redis箱格信息數(shù)據(jù)同步到數(shù)據(jù)庫Mysql的功能。

自己想了想,也有大概方案。

1、隊列同步,變跟數(shù)據(jù)2份,使用消息隊列,一份給Redis消費,一份給Mysql消費。

2、后臺定時任務(wù),定時刷新Redis中箱格信息到數(shù)據(jù)庫。

網(wǎng)上也到處找了下解決方案,發(fā)現(xiàn)這么個問題,居然是天下一大抄,還抄的一字不差,我也抄吧。

方案一:

讀: 讀redis->沒有,讀mysql->把mysql數(shù)據(jù)寫回redis

寫: 寫mysql->成功,寫redis。

就是讀的話,先讀Redis,Redis沒有再讀數(shù)據(jù)庫,將數(shù)據(jù)庫中的數(shù)據(jù)放入Redis。

寫(增刪改),先寫數(shù)據(jù)庫,然后寫Redis。

可以對此稍微優(yōu)化,比如要求一致性高的數(shù)據(jù),從數(shù)據(jù)庫讀,比如金融,交易數(shù)據(jù)。不要求強一致性的從Reids中讀取。

方案二:

基于binlog使用mysql_udf_redis,將數(shù)據(jù)庫中的數(shù)據(jù)同步到Redis。

方案三:

基于MQ,也就是最上面想到的方式1。

方案四:

官方有個memcached的udf插件,如果不是那么強烈非要redis的話,也可以考慮

如果是我選擇2,順便推薦發(fā)下大神的廣告:http://coolshell.cn/articles/17416.html

方案五:

用POSTGRESQL 替代 Mysql +Redis.

各種方案弊端

但是上面的方案都有各自的弊端。

方案一,明顯對于數(shù)據(jù)量巨大,更新頻繁的數(shù)據(jù)寫入無能為力。比如E棧終端的箱格,箱格數(shù)量巨大,每個箱格的變跟狀態(tài)又很頻繁,這樣很容易把數(shù)據(jù)庫寫掛。

方案二,是使用的mysql的User Defined Function功能,mysql_udf_redis是有人實現(xiàn)的同步數(shù)據(jù)到Redis的功能,弊端:需要學習成本,而來,第三方的插件不穩(wěn)定。

方案三:怎么保證到數(shù)據(jù)庫和到Redis中的狀態(tài)一致性。就是假設(shè)一條修改數(shù)據(jù),從隊列寫入到Mysql成功,但是寫入到Redis失敗,這種如何搞。還有就是需要一個消息隊列,使用第三方的比如Kafka,RabbitMq等來實現(xiàn),管理起來不方便,系統(tǒng)整體穩(wěn)定性不行,而且只是這么個比較小的箱格數(shù)據(jù)信息同步。有點殺雞用牛刀。

其他的方案:

訂閱key的變化進行數(shù)據(jù)庫更新,寫的時候?qū)?份,一份往Redis寫,一份是Redis數(shù)據(jù)的key網(wǎng)更新隊列(也可以直接Reids存)里寫,再寫個定時程序從更新隊列里取時間,根據(jù)key取出Redis數(shù)據(jù)到Mysql.

這個方案,其實和其他的不一樣,弊端了,就是占用內(nèi)存大,因為需要維護一份更新隊列。

最后了,我上級是說用定時任務(wù),刷Redis中的箱格狀態(tài)信息到數(shù)據(jù)庫。2W個終端,一個終端100個箱格,200W個箱格,首先是進行狀態(tài)比對,狀態(tài)不一致的放入集合,批量update數(shù)據(jù)庫。

其實也會有寫小問題,比如在比對的時候:

1、Redis中的箱格狀態(tài)變跟了,怎么辦?我們不可能在比對的時候鎖住Redis,200W次循環(huán),這段時間完全可能發(fā)生狀態(tài)變跟。

2、在比對的時候,有人更新了數(shù)據(jù)庫,怎么辦?因為有些操作是可以直接更新數(shù)據(jù)庫的。比如更新箱格的layoutRow之類的信息。

以上就是MySQL和Redis 怎么實現(xiàn)數(shù)據(jù)同步,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI