redis数据同步到mysql_将Redis数据同步到MySQL的最佳策略是什么?

bd96500e110b49cbb3cd949968f18be7.png

The use case is to use Redis to be local cache of MySQL

The data format in MySQL is: a single primary key and several other fields. There will not be queries cross table of db

Redis key is primary key in MySQL, and value is hash containing other fields in MySQL

When power off, less than one minute data lose is acceptable.

My solution is:

Redis writes AOF file, some process will monitor this file and sync the updated datas to MySQL

Hack Redis to write AOF in several files, just like MySQL binlog

The data interface will only read and write through Redis

Is this solution OK?

And what's the best strategy to do this job?

解决方案

You don't need to hack anything ;)

I am not entirely sure why you need the data on mysql. If I knew, maybe there would be a more suitable answer. In any case, as a generic answer you can use redis keyspace notifications

You could subscribe to the commands HSET, HMSET, HDEL and DEL on your keys, so you would get a notification everytime a key is deleted or a hash value is set or removed.

Note if you miss any notification you would have an inconsistency. So once in a while you could just use the SCAN command to go through all your keys and check on mysql if they need to be updated.

Another strategy could be maintaining two separate structures. One would be the hash with the values, and the other would be a ZSET of all the values sorted by timestamp of update. The best way to keep both structures up to date would be to write two or three lua scripts (insert/update and delete) that would operate on the hash and the zset atomically.

Then you can just periodically query the ZSET for the elements with a timestamp higher than your last sync operation, get all the keys that were updated (it would include deleted keys, unless you want to keep a second ZSET exclusively for those) and then just retrieve all the elements by key and sync to mysql.

Hope it will work for you!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值