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

时间:2014-04-15 10:04:36

标签: mysql database architecture redis

  1. 用例是使用Redis作为MySQL的本地缓存
  2. MySQL中的数据格式是:单个主键和其他几个字段。不存在db
  3. 的跨表查询
  4. Redis键是MySQL中的主键,值是包含MySQL中其他字段的哈希
  5. 关闭电源时,可以接受不到一分钟的数据丢失。
  6. 我的解决方案是:

    1. Redis编写AOF文件,某些进程将监视此文件并将更新的数据同步到MySQL
    2. Hack Redis在几个文件中编写AOF,就像MySQL binlog
    3. 一样
    4. 数据接口只能通过Redis读取和写入
    5. 这个解决方案好吗?
      那么做这项工作的最佳策略是什么?

3 个答案:

答案 0 :(得分:19)

你不需要破解任何东西;)

我不完全确定为什么需要mysql上的数据。如果我知道,也许会有更合适的答案。无论如何,作为一般答案,您可以使用redis keyspace notifications

您可以在密钥上订阅HSET,HMSET,HDEL和DEL命令,这样每次删除密钥或设置或删除哈希值时都会收到通知。

请注意,如果您错过任何通知,则会出现不一致。所以有一段时间你可以使用SCAN命令遍历所有密钥并检查mysql是否需要更新。

另一种策略可能是维持两个独立的结构。一个是具有值的散列,另一个是按更新的时间戳排序的所有值的ZSET。保持两种结构最新的最好方法是编写两个或三个lua脚本(插入/更新和删除),这些脚本将以原子方式对哈希和zset进行操作。

然后,您可以定期查询ZSET,查找时间戳高于上次同步操作的元素,获取所有已更新的密钥(包括已删除的密钥,除非您想为这些密钥保留第二个ZSET)然后只需按键检索所有元素并同步到mysql。

希望它对你有用!

答案 1 :(得分:2)

您可以实施redis replication协议 但是你的要求有github project

稳定版本为2.5.0

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

答案 2 :(得分:0)

在Redis中更新值时,可以将值放在其他队列中,例如Redis中的List。然后使用Queue中的值并更新Mysql。

如果Redis数据不是太多,只需使用Scheduler将所有数据批量刷新到Mysql。