您现于de位置乃:亚博 > 其他

亚博 2019-08-29 其他 168

MySQL和Redis 数据同步解决方案整理

现于于中集E栈工作 最近于做1个Redis箱格信息数据同步到数据库Mysqlde功能.

自己想了想 也有大概方案.

1.队列同步 变跟数据2份 使用消息队列 1份给Redis消费 1份给Mysql消费.

2.后台定时任务 定时刷新Redis中箱格信息到数据库.

网上也到处找了下解决方案 发现这么个问题 居然乃天下1大抄 还抄de1字不差 我也抄吧.

方案1:

读: 读redis->没有 读mysql->把mysql数据写回redis

写: 写mysql->成功 写redis.

就乃读de话 先读Redis,Redis没有再读数据库 将数据库中de数据放入Redis.

写(增删改) 先写数据库 然后写Redis.

可以对此稍微优化 比如要求1致性高de数据 从数据库读 比如金融 交易数据.不要求强1致性de从Reids中读取.

方案2:

基于binlog使用mysql_udf_redis 将数据库中de数据同步到Redis.

方案3:

基于MQ 也就乃最上面想到de方式1.

方案4:

官方有个memcacheddeudf插件 如果不4敲辞苛曳且猺edisde话 也可以考虑

如果乃我选择2 顺便推荐发下大神de广告:http://coolshell.cn/articles/17416.html

方案5:

用POSTGRESQL 替代 Mysql +Redis.


各种方案弊端

但乃上面de方案都有各自de弊端.

方案1 明显对于数据量巨大 更新频繁de数据写入无能为力.比如E栈终端de箱格 箱格数量巨大 每个箱格de变跟状态又很频繁 这样很容易把数据库写挂.

方案2 乃使用demysqldeUser Defined Function功能 mysql_udf_redis乃有人实现de同步数据到Redisde功能 弊端:需要学习成本 而来 第3方de插件不稳定.

方案3:怎么保证到数据库和到Redis中de状态1致性.就乃假设1条修改数据 从队列写入到Mysql成功 但乃写入到Redis失败 这种如何搞.还有就乃需要1个消息队列 使用第3方de比如Kafka RabbitMq等来实现 管理起来不方便 系统整体稳定性不行 而且只乃这么个比较小de箱格数据信息同步.有点杀鸡用牛刀.

其他de方案:

订阅keyde变化进行数据库更新 写de时候写2份 1份往Redis写 1份乃Redis数据dekey网更新队列(也可以直接Reids存)里写 再写个定时程序从更新队列里取时间 根据key取出Redis数据到Mysql.

这个方案 其实和其他de不1样 弊端了 就乃占用内存大 因为需要维护1份更新队列.

最后了 我上级乃说用定时任务 刷Redis中de箱格状态信息到数据库.2W个终端 1个终端100个箱格 200W个箱格 首先乃进行状态比对 状态不1致de放入集合 批量update数据库.


其实也会有写小问题 比如于比对de时候:

1.Redis中de箱格状态变跟了 怎么办?我们不可能于比对de时候锁住Redis 200W次循环 这段时间完全可能发生状态变跟.

2.于比对de时候 有人更新了数据库 怎么办?因为有些操作乃可以直接更新数据库de.比如更新箱格delayoutRow之类de信息.

 

评论