缓存与数据库闲更新哪个?

缓存与数据库闲更新哪个?

方案1:先删除缓存,然后更新数据库

在并发情况下删除缓存后,立刻读库,此时库中数据还没更新,读到老数据,又写入了缓存,导致以后所有人读到的都是缓存中的错误数据

方案2:先更新数据库,然后更新缓存

更新数据库后,还没删除缓存,导致部分人读到的是缓存中的老数据,当缓存删除后,才能从数据库读取正确数据,缓存也就正确,以后大部分人读到正确数据

两个方案无法保证原子性
关键点:不要更新缓存,而是删除缓存
缓存数据可能是很复杂的数据,拿到数据库数据之后还会进行一系列的计算,短期内用不上,达到过期时间这样就浪费io,cpu资源
更新缓存与删除缓存也存在一致性问题

删除缓存失效后的问题
1、 失效补偿,删除失败后,可以把信息打到一个补偿队列中,监听补偿队列来做补偿操作
2、 监听binlog,成熟中间件,比如canal,只要数据更新成功就一定有binlog,canal只要监听到新的binlog,说明就要删除缓存,
如果补偿队列或canal中间件挂了?用守护进程,自动拉起进程
2pc,3pc分布式协议来保证强一致性,性能就会差很多

以上说的问题,考虑点应该先从场景出发,
1、 对数据安全高的场景一定要先更新数据库,不如订单类
2、 对性能要求高的场景一定先更新缓存,不如秒杀类

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值