轉載:Redis與Mysql數據同步解決方案整理

最近在做一個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的話,也可以考慮

方案五:

用POSTGRESQL 替代 Mysql +Redis.

各種方案弊端

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

方案一,明顯對於數據量巨大,更新頻繁的數據寫入無能爲力。比如數量巨大,每個變跟狀態又很頻繁,這樣很容易把數據庫寫掛。

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

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


其他的方案:

訂閱key的變化進行數據庫更新,寫的時候寫2份,一份往Redis寫,一份是Redis數據的key網更新隊列(也可以直接Reids存)裏寫,再寫個定時程序從更新隊列裏取時間,根據key取出Redis數據到Mysql.

這個方案,其實和其他的不一樣,弊端了,就是佔用內存大,因爲需要維護一份更新隊列。

可以用定時任務,刷Redis中的信息到數據庫。先是進行狀態比對,狀態不一致的放入集合,批量update數據庫。


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

1.Redis中的數據狀態變跟了,怎麼辦?我們不可能在比對的時候鎖住Redis,200W次循環,這段時間完全可能發生狀態變跟。

2.在比對的時候,有人更新了數據庫,怎麼辦?因爲有些操作是可以直接更新數據庫的。比如更新layoutRow之類的信息。


Redis同步mysql大致有兩種同步,第一種是mysql 同步到redis,爲了兼容手動在mysql數據庫操作的同步,可以解析mysql的binlog,當數據庫發生增,刪,改時自動同步到redis,
可以使用的庫有[open-replicator](GitHub - whitesock/open-replicator: Open Replicator is a high performance MySQL binlog parser written in Java. It unfolds the possibilities that you can parse, filter and broadcast the binlog events in a real time manner.),

如果想同步redis數據到mysql,可以使用
[redis-replicator](leonchen83/redis-replicator)

<dependency>
    <groupId>com.moilioncircle</groupId>
    <artifactId>redis-replicator</artifactId>
    <version>2.3.1</version>
</dependency>



另外分享一篇mysql刷新自動同步到redis的文章,利用mysql的udf函數利用redis的api從mysql同步到redis;利用c++編寫redis的函數,利用mysql加載udf,然後採用觸發器
自動同步到redis

通過UDF使mysql主動刷新redis緩存



參考的幾篇大神的文章:

1. <<緩存更新的套路>>:http://coolshell.cn/articles/17416.html

2. <<分佈式系統的事務處理>>:http://coolshell.cn/articles/10910.html

3. <<redis與mysql數據同步代碼演示>>:http://www.cnblogs.com/linjiqin/p/3569011.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章