如何同步Redis中的数据到MySQL中
最近准备把主存储数据库从MySQL迁移到Redis上面来,降低数据IO的瓶颈,但是为了运维查询方便以及灾备考虑把Redis的数据同步到MySQL里面做备份。所以有了下面这篇文章。
场景描述:
1.需要存放在MySQL中的数据表是单主键,在业务逻辑中不存在跨表查询的需求。
2.在Redis中的key为MySQL中对应的数据表主键,value为hash表,hash表的字段对应MySQL的数据表的其他字段。
3.当遇到掉电,可以接受小于1分钟以内的数据丢失。
第一版解决方案:
1.Redis开启AOF,同时写一个监控程序,同步将Redis中更新的数据定时存储到MySQL中。
2.数据读取写入全部通过Redis。
3.解析AOF文件,根据AOF文件来实现数据同步,类似MySQL的binlog功能。
上面需要自己编写程序来接收业务端传输过来的数据存放到MySQL中,业务数据可能会发生某些变化。
优化方案:
一:通过查看Redis的手册,发现Redis提供了一个keyspace 订阅的功能,Redis的客户端可以通过订阅命令操作发生的变化来同步更新MySQL中的数据。
但是实际使用中发现可能会漏掉一些通知信息,这个时候我们可以定时的基于MySQL的键值使用SCAN命令对Redis中的数据进行检测判断是否发生变化,如果发生变化将其更新到MySQL。
二:维持两个独立的数据结构,一个是包含完整key-value数据的hash,一个是包含键值且按时间排序的ZSET。
需要保持这两个数据结构同时是最新的,所以在操作这两个数据结构时候需要使用原子操作来执行。然后通过定时扫描ZSET中的更新来对MySQL中的数据进行更新。
这两个方案目前都没有完全完成,这里做一个记录,等完成了之后再来做一个补充。