Redis和数据库数据不一致的问题

针对读多写少的高并发场景,我们可以使用缓存来提升查询速度。

• 如果数据在Redis存在,应用就可以直接从Redis拿到数据,不用访问数据库。

• 如果Redis里面没有,先到数据库查询,然后写入到Redis,再返回给应用。

问题一:

  • 一旦被缓存的数据发生变化的时候,我们既要操作数据库的数据,也要操作Redis的数据,所以问题来了。现在我们有两种选择:

• 先操作Redis的数据再操作数据库的数据

• 先操作数据库的数据再操作Redis的数据

只要有一方失败就会导致数据不一致

这种情况需要更具的我们的业务场景而定,数据库的实时性一致性要求不是特别高的场合,

可以采用定时任务查询数据库数据定时同步到Redis的方案。由于我们是以数据库的数据为准的,所以给缓存设置一个过期时间,是保证最终一致性的解决方案。

问题二:

当存储的数据发生变化,Redis的数据也要更新的时候,我们有两种方案,一种就是直接更新,调用set;还有一种是直接删除缓存,让应用在下次查询的时候重新写入。

判断是不是要经过其他表的查询、接口调用、经过复杂的计算才能得到最新的数据,而不是直接从数据库拿到的值,如果是的话,建议直接删除缓存,这种方案更加简单,一般情况下也推荐删除缓存方案。

异常情况:

  • 更新数据库成功,删除缓存失败。数据库是新数据,缓存是旧数据,发生了不一致的情况。

如果删除缓存失败,我们捕获这个异常,把需要删除的key发送到消息队列。然后自己创建一个消费者消费,尝试再次删除这个key,进行消息重试

  • 先删除缓存,再更新数据库

如果有程序并发操作的情况下:

•线程A需要更新数据,首先删除了Redis缓存

•线程B查询数据,发现缓存不存在,到数据库查询旧值,写入Redis,返回

•线程A更新了数据库

例如,我们产品库缓存,可以通过建刷新缓存的任务,来进行缓存刷新,不管线程A还是线程B都是建刷新缓存的任务,在业务上可以对同一个刷新缓存的id进行去重

具体得结合自己的业务场景,面试官基本会问你项目中的缓存时怎么使用的,怎么保证一致性的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值