数据库一致性问题

文章探讨了数据库一致性问题,特别是在Redis和MySQL之间的数据同步。提到了两种常见方案:先更新数据库再更新缓存,以及先删除缓存再更新数据库,但两者都可能引发不一致。为了实现最终一致性,文章提到了RocketMQ的重试机制、Canel监听binlog以及延迟双删策略。同时,文章指出,保证两个操作成功的解决方式包括重试机制和订阅MySQLbinlog进行异步操作缓存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库一致性问题是面试常考的内容。包含MySQL主从一致性,Redis和MySQL的一致性问题,以及Redis集群一致性问题等。如果面试官问道这个问题,还是想更多的考察对一些实际业务的理解吧。至少这一段在找暑期实习的过程中,不乏面试官对一致性的考察。


Redis与MySQL的一致性:

如果问道这个问题,首先要说两者的身份,一个是内存数据库,起到缓存的作用,主要是负责再用户与MySQL提供一个快速的读服务。

即减少向数据库读操作的行为,减少数据库IO操作,提升IO性能。

具体流程:

应用程序需要去读取数据库中的数据时,先去查询缓存,如果命中则直接返回。如果缓存不命中,则会去看MySQL中的数据,然后再把数据填充到Redis当中。

问题:

一份数据同时保存在Redis和MySQL当中,当发生数据更新的时候,会面临不一致的问题。

方案:

1. 先更新数据库再更新缓存

2. 先删除缓存,再更新数据库。

对于方案2来说,分别对redis和MySQL的操作都不是原子的,多线程访问下还是会不一致。

对于方案1来说,由于缓存写入的通常要比数据库写入快很多,不一致状况出现的少。

最终一致性方案:

1. 基于rocketmq的重拾机制

2. canel组件,监听binlog,来即时将MySQL操作更新至Redis当中。

或者加锁,这样会很明显的影响性能。


当前主流的推荐方案:延迟双删,但注意,这个不是强一致性。

延迟双删主要针对【先删除缓存,再更新数据库】方案再【读+写】并发请求而造成缓存不一致时的问题。


对于推荐的实践方案【先更新数据库,再删除缓存】,如何保证两个操作都能执行成功?

删除缓存的时候毕竟是操作的Redis,存在失败的可能性

具体的解决方式有两个:

1. 重试机制

2. 订阅MySQL binlog,再操作缓存

上述两种方式的特点都是异步操作缓存。


参考资料:

【Java面试】大中小厂都会问到的面试题?学到就是提前预约好offer!Redis和Mysql如何保证数据一致性?_哔哩哔哩_bilibili

数据库和缓存如何保证一致性? | 小林coding (xiaolincoding.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值