删不掉的缓存

背景:

系统里有一个修改数据的方法,在修改数据之后,删除了redis的缓存

写缓存是通过下次查询时懒加载写入到redis的

问题:

测试的时候发现这个缓存删不掉

分析:

怀疑是不是没有执行,或者执行失败了

经过调试发现删除缓存的代码确实是执行了,且执行成功

怀疑是不是在删除缓存之后,有人刚好调用了查询数据,这也太巧了吧

确认了一下,方法上有事务。也就是说在删除缓存之后,事务还没有提交,数据库中的数据还不是新数据,这时候有人调用了查询接口。这个推论很合理,但是就是太巧合,不可能这么巧。

又调用了几次,发现缓存的数据每次都是最新的上个版本,与推论吻合。

删除缓存之后的代码执行需要很长时间吗?往下看代码发现推送消息给了另外一个系统。再看查询数据的接口,对外提供了rpc接口,然后发现那个系统确实在那个时间点调用了这个rpc接口。

这就讲得通了:

A系统在删除缓存之后,推了消息给B系统,后面还有一段代码导致方法没有立即结束,B系统收到消息之后立马来请求了数据,响应实在是太快了,由于A系统事务还没有提交,导致B系统请求到的是旧数据,并写入了缓存。完美,合情合理。

解决:

  • 方案一,删除缓存之后立马将新数据写入到缓存,存在隐患,如果后续代码发生异常导致数据回滚,则缓存与数据库不一致
  • 方案二,去掉事务,适合可以接受去掉事务的场景,前提是需要谨慎评估去掉事务后的影响
  • 方案三,删除缓存之后立马结束事务,后续逻辑在事务之外执行,具体业务具体分析

方案都有局限性,选择最适合的即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

n_rts

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值