本篇文章給大家分享的是有關MySQL和Redis 怎么實現數據同步,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
MySQL和Redis 數據同步解決方案總結
現在在中集E棧工作,最近在做一個Redis箱格信息數據同步到數據庫Mysql的功能。
自己想了想,也有大概方案。
1、隊列同步,變跟數據2份,使用消息隊列,一份給Redis消費,一份給Mysql消費。
2、后臺定時任務,定時刷新Redis中箱格信息到數據庫。
網上也到處找了下解決方案,發現這么個問題,居然是天下一大抄,還抄的一字不差,我也抄吧。
方案一:
讀: 讀redis->沒有,讀mysql->把mysql數據寫回redis
寫: 寫mysql->成功,寫redis。
就是讀的話,先讀Redis,Redis沒有再讀數據庫,將數據庫中的數據放入Redis。
寫(增刪改),先寫數據庫,然后寫Redis。
可以對此稍微優化,比如要求一致性高的數據,從數據庫讀,比如金融,交易數據。不要求強一致性的從Reids中讀取。
方案二:
基于binlog使用mysql_udf_redis,將數據庫中的數據同步到Redis。
方案三:
基于MQ,也就是最上面想到的方式1。
方案四:
官方有個memcached的udf插件,如果不是那么強烈非要redis的話,也可以考慮
如果是我選擇2,順便推薦發下大神的廣告:http://coolshell.cn/articles/17416.html
方案五:
用POSTGRESQL 替代 Mysql +Redis.
各種方案弊端
但是上面的方案都有各自的弊端。
方案一,明顯對于數據量巨大,更新頻繁的數據寫入無能為力。比如E棧終端的箱格,箱格數量巨大,每個箱格的變跟狀態又很頻繁,這樣很容易把數據庫寫掛。
方案二,是使用的mysql的User Defined Function功能,mysql_udf_redis是有人實現的同步數據到Redis的功能,弊端:需要學習成本,而來,第三方的插件不穩定。
方案三:怎么保證到數據庫和到Redis中的狀態一致性。就是假設一條修改數據,從隊列寫入到Mysql成功,但是寫入到Redis失敗,這種如何搞。還有就是需要一個消息隊列,使用第三方的比如Kafka,RabbitMq等來實現,管理起來不方便,系統整體穩定性不行,而且只是這么個比較小的箱格數據信息同步。有點殺雞用牛刀。
其他的方案:
訂閱key的變化進行數據庫更新,寫的時候寫2份,一份往Redis寫,一份是Redis數據的key網更新隊列(也可以直接Reids存)里寫,再寫個定時程序從更新隊列里取時間,根據key取出Redis數據到Mysql.
這個方案,其實和其他的不一樣,弊端了,就是占用內存大,因為需要維護一份更新隊列。
最后了,我上級是說用定時任務,刷Redis中的箱格狀態信息到數據庫。2W個終端,一個終端100個箱格,200W個箱格,首先是進行狀態比對,狀態不一致的放入集合,批量update數據庫。
其實也會有寫小問題,比如在比對的時候:
1、Redis中的箱格狀態變跟了,怎么辦?我們不可能在比對的時候鎖住Redis,200W次循環,這段時間完全可能發生狀態變跟。
2、在比對的時候,有人更新了數據庫,怎么辦?因為有些操作是可以直接更新數據庫的。比如更新箱格的layoutRow之類的信息。
以上就是MySQL和Redis 怎么實現數據同步,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。