Java面试7-Redis和Mysql如何保证数据一致性?

本文探讨了Redis作为缓存层时如何处理数据一致性问题,包括并发更新导致的潜在冲突,并介绍了利用RocketMQ和Canal实现最终一致性的方式,以及其适用场景限制。
摘要由CSDN通过智能技术生成

一般情况下,Redis用来实现应用和数据库之间读操作的缓存层,主要目的是减少数据库IO,还可以提升数据的IO性能。
Redis的整体架构是:当应用程序需要去读取某个数据的时候,首先会先尝试去Redis里面加载,如果命中就直接返回。如果没有命中,就从数据库查询,查询到数据后再把这个数据缓存到Redis里面。在这样一个架构中,会出现一个问题,就是一份数据同时保存在数据库和Redis里面,当数据发生变化的时候,需要同时更新Redis和Mysql,由于更新是有先后顺序的,并且它不像Mysql中的多表事务操作,可以满足ACID特性,所以就会出现数据一致性问题。在这种情况下,能够选择的方法只有几种:

  1. 先更新数据库,再更新缓存。如果缓存更新失败,就会导致数据库和Redis中的数据不一致。
  2. 先删除缓存,再更新数据库。理想情况是应用下次访问Redis的时候,发现Redis里面的数据是空的,就从数据库加载保存到Redis里面,那么数据是一致的。但是在极端情况下,由于删除Redis和更新数据库这两个操作并不是原子的,所以这个过程如果有其他线程来访问,还是会存在数据不一致的问题
  3. 如果需要在极端情况下仍然保证Redis和Mysql的数据一致性,就只能采用最终一致性方案。比如基于RocketMQ的可靠性消息通信,来实现最终一致性:1. 更新数据库的数据;2. 更新Redis的数据;3. 失败的请求写入MQ事务消息;4. 异步重试,确保成功。还可以直接通过Canal组件,监控Mysql中binlog日志,把更新后的数据同步到Redis里面。因为这里是基于最终一致性来实现的,如果业务场景不能接受数据的短期不一致,那就不能使用这个方案来做。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值