数据一致性问题

MySQL跟Redis数据同步

redis作为数据库的缓存层,主要的存在意义是减少数据库IO操作,加快数据查询性能

1.先更新数据库,在更新缓存(可能会出现更新缓存时失败,导致缓存数据跟数据库数据不一致,而访问数据时都是先访问缓存的,会造成很大的影响)

2.先删除环境,在更新数据库(操作都是非原子性的,依然容易出现问题)

3.使用中间件,先更新数据库,如何使用mq等中间件通知redis进行数据更新

4.使用canal,监听数据库binglog日志,同步到redist

5.使用读写锁,在更新数据时,其他任何请求都没有办法去修改redis跟数据库中的数据

ES跟Redis数据同步

1、同步双写
应用的数据,同步双写到mysql和es
优点:
1、业务简单;2、实时性高;
缺点:
1、硬编码,有mysql写入,就要写写入es的代码
2、业务强耦合
3、双写业务丢失
4、两个都写降低性能,增加单位方法的耗时和性能
2、异步双写(应用双写)(MQ异步)
借助mq实现异步的多源写入
优点:
1、性能高;2、不易出现数据丢失问题;(主要来源于mq消息的消费保障机制,比如es宕机或写入失败还能重新消费mq消息);3、多源写入之间相互隔离。便于扩展更多的数据源写入
缺点:
1、硬编码,接入新的数据源需要实现新的消费者代码;
2、系统复杂度增加,映入了消息中间件
3、数据实时问题,mq是异步消费,用户输入,不一定会马上同步让他看到
3、基于sql抽取(定时任务)
用定时器处理,常用方案新增一个updatetime字段,比较此字段来确认变更数据。再写入es
优点:
1、不改原代码,没有硬编码;
2、没有业务强耦合,不改变原来程序的性能;
3、worker代码编写简单,不需要考虑增删改查;
缺点:
1、对mysql的轮训压力
2、数据有时间延迟
优化的方案:
1、轮寻放到压力不大的从库上
2、借助logstash实现数据同步
4、基于Binlog实时同步
实施步骤 1、读取mysql 的binlog日志,获取指定表的日志信息;2、将读取的信息转为mq;3、编写一个mq消费程序;4、不断消费mq,每费完一条消息,将消息写入到es中;

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值