问题出现原因
  • 并发时候无法保证读写的先后顺序,如果删掉了缓存还没来得及写库,另外一个县城就多来读取,发现缓存为空就去读取数据库并且写入缓存,这时候缓存中就是脏数据
  • 如果先写库,在删除缓存前,写库的线程宕机,没有删除掉缓存,则也会出现不一致的情况
  • 如果redis集群,在注册模式中,写主库,读从库,也会出现redis复制存在的一些延迟操作,也可能导致数据不一致
解决方案
双删除+超时
  • 写库前后都加上redis.del(key)操作,并且舍得合了的超时时间,这样最差的情况就是在超时时间之内存在不太一致,当然这种情况极其少见,可能的原因就是服务器宕机,此种情况可以满足绝大多数需求
  • 这种策略要考虑redis的和数据库注册同步的耗时,所以第二次删除前最好先等待一段时间,等待同步完成,然后在删除,这样缺点也会增加线程占用时间。
通过读取binlog的方式,异步淘汰缓存

  • 好处在于业务上的侵入性低,将缓存和数据库的不一致时间尽量缩小。
  • binlog介绍:mysql的binlog日志作用在于记录mysql内部的增删改查等对mysql有更新操作的内容的记录,对数据的select已经show不会被binlog记录,主要用于数据库的主从复制,以及增量恢复。
  • binlog日志模式:
    • STATEMENT模式(SBR):每条修改数据库的sql都会记录到binlog中,有点事并不需要记录每条sql和每一行数据的变化,有点在于减少binlog日志,缺点是某些情况下master-slave数据不一致比如,sleep()函数,last_insert_id()
    • ROW模式(RBR):不记录每条sql的上下文信息,仅需要记录那条数据被修改了,修改成什么样,不会出现某些特定的情况下的存储过程或者function或者targger的调用和出发无法被复制的问题,但是会产生大量的日志
    • MIXED模式(MBR)以上两种模式的混合使用,一般复制使用STATEMENT模式保持binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,mysql会根据执行的sql语句选择日志保持方式
mysql的UDF
  • 这种方法思路是通过数据库中的Targger调用自定义的函数库来触发对redis的操作,但是这个有一定学习成本,需要基于mysql的APi进行开发使用的C++语言,阿里早期的解决方案
binlog具体实施方案
  • 通过使用open-replicator解析binlog
  • 使用canal进行同步—阿里框架
canal介绍(http://www.cnblogs.com/duanxz/p/5062833.html)
  • mysql主从负责工作原理

  • 负责分为三步
  1. master将改变记录到二进制日志binary log 中, 可以通过mysql命令 show binlog events查看
  2. slave将master的binary log events 拷贝到他的中继日志,用来中转数据
  3. slave重做中继日志中的事件,将改变反映他自己的数据
  • canal工作原理

  1. canal是模式mysql slave的交互协议,伪装ziji shi mysql slave,向master发送dump协议
  2. mysql master 收到dump请求,开始推送binary log给slave(这里的slave就是canal)
  3. canal解析binary log对象
canal官网
  • quickStart:https://github.com/alibabatech/canal/wiki/QuickStart
  • 项目代码:https://github.com/alibabatech/canal
  • 阿里升级版本otter:https://github.com/alibaba/otter

Redis和DB数据一致性解决方案相关推荐

  1. redis系列之数据库与缓存数据一致性解决方案

    redis系列之数据库与缓存数据一致性解决方案 参考文章: (1)redis系列之数据库与缓存数据一致性解决方案 (2)https://www.cnblogs.com/jiawen010/p/1215 ...

  2. redis系列之数据库与缓存数据一致性解决方案(简单易懂)

    数据库与缓存读写模式策略 写完数据库后是否需要马上更新缓存还是直接删除缓存? (1).如果写数据库的值与更新到缓存值是一样的,不需要经过任何的计算,可以马上更新缓存,但是如果对于那种写数据频繁而读数据 ...

  3. Redis与DB数据同步问题

    2019独角兽企业重金招聘Python工程师标准>>> Redis与DB数据同步问题 https://www.jianshu.com/p/e8b36ef79c93 Redis缓存数据 ...

  4. 掘地三尺搞定 Redis 与 MySQL 数据一致性问题

    若有收获,请记得分享和转发哦 Redis 拥有高性能的数据读写功能,被我们广泛用在缓存场景,一是能提高业务系统的性能,二是为数据库抵挡了高并发的流量请求, 把 Redis 作为缓存组件,需要防止出现以 ...

  5. 这可能是目前最全的Redis高可用技术解决方案

    转自:https://mp.weixin.qq.com/s/Z-PyNgiqYrm0ZYg0r6MVeQ 原作者:张东洪 常见的使用方式 Redis的几种常见的使用方式包括: Redis 单副本 Re ...

  6. Redis高可用技术解决方案大全

    近来一直在折腾redis高可用的方案,以及优缺点以及如何选择合适的方案线上使用, 刚好看到这篇,分享下 Redis常见的几种主要使用方式: Redis 单副本 Redis 多副本(主从) Redis ...

  7. Redis 缓存问题(Redis 与 DB 更新一致性问题、缓存击穿、缓存穿透、缓存雪崩)

    Redis 与 DB 更新一致性问题 缓存更新策略 1. 内存淘汰 说明:不用自己维护,利用 Redis 的内存淘汰机制,当内存不足时自动淘汰部分数据,下次查询时更新缓存 一致性:差 维护成本:无 2 ...

  8. 微服务场景下的数据一致性解决方案

    数据一致性是构建业务系统需要考虑的重要问题 , 以往我们是依靠数据库来保证数据的一致性.但是在微服务架构以及分布式环境下实现数据一致性是一个很有挑战的的问题.ServiceComb作为开源的微服务框架 ...

  9. 分布式系统数据一致性解决方案

    2019独角兽企业重金招聘Python工程师标准>>> 1.微服务架构的数据一致性问题 以电商平台为例,当用户下单并支付后,系统需要修改订单的状态并且增加用户积分.由于系统采用的是微 ...

最新文章

  1. java treeset 重复,关于 TreeSet 为什么我这样写,还有是有重复的记录啊啊啊啊
  2. PHP获取今天开始和结束的时间戳
  3. 21、 TRUNCATE:清空表记录
  4. 电影《麦田》的外景地其实是呼伦贝尔
  5. cab文件介绍及制作方法
  6. 非x面容解锁插件ios13_iOS13.5 Beta3 推送,戴口罩解锁更加方便
  7. 总结 | 那些里程碑意义的深度学习目标检测论文
  8. 345. Reverse Vowels of a String - LeetCode
  9. python remove函数_Python列表的remove方法的注意事项
  10. MongoDB的下载、安装与部署
  11. VFP DownFileX下载异常问题
  12. 如何安装uclient_UClient客户端下载_UClient客户端官方下载-太平洋下载中心
  13. Python 好友管理系统【简单易懂,代码可以直接运行】
  14. Java---(SpringBlade框架)后台从数据库读取所有点的经度和纬度,传输到前端显示在地图上
  15. pytorch和python的区别_Keras和PyTorch的视觉识别与迁移学习对比
  16. org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容。
  17. 看几个拿到外企offer的故事... 送你一套免费英语资料(价值1899)
  18. acm刷题一些总结,至每一个努力拼搏的acmer
  19. 基于Vue+Java实现的在线聊天APP系统设计与实现
  20. 义务教师 obligatory tutor

热门文章

  1. C和指针之函数之归以字符形式按顺序打印数字的每位数字(递归和非递归)
  2. Android之如何使用快速联系徽章
  3. php stripslashes 去除反斜线
  4. python typeerror* wants int_python-TypeError:’int’对象是不可迭代的?
  5. mysql怎么改字体编码_mysql怎么改字符编码?
  6. 神奇又好玩的谢尔宾斯基雪花!
  7. 拿了年终奖后,发现自己又拖后腿了?对不起,可能事实并没有那么糟糕...
  8. 全景图解高铁数据,谁是最有潜力的高铁城市?
  9. json 格式化工具_如何在命令行中优雅地处理JSON
  10. 怎么用java ee编程_Java EE应用程序入门 - 编程入门网