from: http://blog.csdn.net/langzi7758521/article/details/52611910

最近在做一个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的话,也可以考虑

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

方案五:

用POSTGRESQL 替代 Mysql +Redis.

各种方案弊端

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

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

方案二,是使用的mysql的User Defined Function功能,mysql_udf_redis是有人实现的同步数据到Redis的功能,弊端:需要学习成本,而来,第三方的插件不稳定。

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

其他的方案:

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

这个方案,其实和其他的不一样,弊端了,就是占用内存大,因为需要维护一份更新队列。

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

其实也会有写小问题,比如在比对的时候:

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

2.在比对的时候,有人更新了数据库,怎么办?因为有些操作是可以直接更新数据库的。比如更新箱格的layoutRow之类的信息。

来自:http://3gods.com/2016/06/23/Redis-Sync-DB.html

参考:http://coolshell.cn/articles/17416.html

http://www.cnblogs.com/linjiqin/p/3569011.html

转载:MySQL和Redis 数据同步解决方案整理的更多相关文章

  1. Mysql和Redis数据同步策略

    为什么对缓存只删除不更新 不更新缓存是防止并发更新导致的数据不一致. 所以为了降低数据不一致的概率,不应该更新缓存,而是直接将其删除, 然后等待下次发生cache miss时再把数据库中的数据同步到缓 ...

  2. redis作为mysql的缓存服务器(读写分离,通过mysql触发器实现数据同步)

    一.redis简介Redis是一个key-value存储系统.和Memcached类似,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录 ...

  3. 用 C# 写一个 Redis 数据同步小工具

    用 C# 写一个 Redis 数据同步小工具 Intro 为了实现 redis 的数据迁移而写的一个小工具,将一个实例中的 redis 数据同步到另外一个实例中.(原本打算找一个已有的工具去做,找了一 ...

  4. redis数据同步之redis-shake

    redis-shake简介 redis-shake是阿里开源的用于redis数据同步的工具,基本功能有: 恢复restore:将RDB文件恢复到目的redis数据库. 备份dump:将源redis的全 ...

  5. mysql 集群 数据同步

    mysql集群配置在网站负载均衡中是必不可少的: 首先说下我个人准备的负载均衡方式: 1.通过nginx方向代理来将服务器压力分散到各个服务器上: 2.每个服务器中代码逻辑一样: 3.通过使用redi ...

  6. Redis数据存储解决方案

    http://www.tuicool.com/articles/77nUZn 1.背景 1.1 Redis简介 官方网站: http://redis.io/ ,Redis是REmote DIction ...

  7. Mysql、ES 数据同步

    数据同步中间件 不足:不支持 ES6.X 以上.Mysql 8.X 以上 ime 标识最大时间 logstash全量.增量同步解决方案 https://www.elastic.co/cn/downlo ...

  8. Mysql和Redis数据如何保持一致

    先阐明一下Mysql和Redis的关系:Mysql是数据库,用来持久化数据,一定程度上保证数据的可靠性:Redis是用来当缓存,用来提升数据访问的性能. 关于如何保证Mysql和Redis中的数据一致 ...

  9. Mysql与Redis的同步实践

    一.测试环境在Ubuntu kylin 14.04 64bit 已经安装Mysql.Redis.php.lib_mysqludf_json.so.Gearman. 点击这里查看测试数据库及表参考 本文 ...

随机推荐

  1. Javascript 在严格模式下禁止指向 this

    如下代码, f() 输出的是 false,而 f2() 输出的是 true. 这是因为 f2 在严格模式下禁止 this 指向全局,所以 this 是 undefined, !this 当然是 tru ...

  2. c#中如何保存焦点控件?

    对所有文本框添加焦点获得事件,头部再定义一个全局的object或者control的类型对象,在焦点获得事件中把当前控件对象赋值给之前定义的object或者control对象,操作的话就对这个全局量操作 ...

  3. TP5 首页导航一级和二级分类

    <ul id="jsddm"> <li><a class="navi_home" href="{:url('/index ...

  4. C# 中的 enum(枚举) 类型使用例子

    一.需要根据数字获取中文名称,C# 代码里面出现if 或switch 判断语句,比如下面的类为test1.class //获取计算类型的值 string AggregateType = string. ...

  5. arcgis license manager 10.2服务无法启动

    (步骤)1. 用cmd切换到 license manager 安装目录,如 C:\Program Files (x86)\ArcGIS\License10.2\bin,输入: Lmgrd -z -c ...

  6. linux 搭建 redis

    找了很多教程总有一个适合我 http://www.cnblogs.com/_popc/p/3684835.html 当然我的目录是/opt/redis   文章中的目录是/usr/local/redi ...

  7. Javascript之类型检测(一)

    js中有7种内置类型,这7种类型又分为2大类:基本数据类型和对象(object) 一.检测原始(基本数据:字符串.数字.布尔.null.undefined.symbol)类型. 用typeof检测原始 ...

  8. JVM内存监视手段和内存溢出解决方案

    引言 本文仅关注一些常见的虚拟机内存监视手段,以及JVM运行时数据区各个部分内存溢出的发生和对应的解决方案,总体来说属于概括性总结,涉及相对不是很深入,目的是让自己和其它初学者有一个框架性.概念性的了 ...

  9. SqlBulkCopy 快速插入数据

    [转]本文来自http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlbulkcopy(v=vs.80).aspx 此代码用于 ...

  10. java 调用windows bat脚本

    当我们需要在java程序中调用外部程序,我们可用通过Runtime.exec()调用来完成. The class java.lang.Runtime features a static method ...