蚂蚁金服java面试真题:如何保障mysql和redis之间的数据一致性?

在高并发场景下,使用Redis作为缓冲减轻数据库压力。为保证数据一致性,可采用懒加载或主动加载模式。懒加载涉及前后双删策略,主动加载则需解决并发时的脏数据问题。双删可能失败,可通过设置缓存过期时间或重试机制应对。面试中还会涉及Java并发、JVM、SQL优化、微服务等相关问题。

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

如何保障mysql和redis之间的数据一致性?

在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问Mysql等数据库。这样可以大大缓解数据库的压力。Redis缓存数据的加载可以分为懒加载和主动加载两种模式,下面分别介绍在这两种模式下的数据一致性如何处理。

懒加载

读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存和数据库间的数据一致性问题。不管是先写数据库,再删除缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况。举个例子:

  1. 如果删除了缓存Redis,还没有来得及写库MySQL,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中为脏数据。
  2. 如果先写了库,在删除缓存前,写库的线程宕机了,没有删除掉缓存,则也会出现数据不一致情况。

因为写和读是并发的,没法保证顺序,就会出现缓存和数据库的数据不一致的问题。如何解决?

所以结合前面例子的两种删除情况,我们就考虑前后双删加懒加载模式。那么什么是懒加载?就是当业务读取数据的时候再从存储层加载的模式,而不是更新后主动刷新,它涉及的业务流程如下如所示:

理解了懒加载机制后,结合上面的业务流程图,我们讲解下前后双删如何做?

延迟双删

在写库前后都进行redis.del(key)操作,并且第二次删除通过延迟的方式进行。

方案一(一种思路,不严谨)具体步骤是:

1)先删除缓存;

2)再写数据库;

3)休眠500毫秒(根据具体的业务时间来定);

4)再次删除缓存。

那么,这个500毫秒怎么确定的,具体该休眠多久呢?</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值