缓存更新策略

3 篇文章 0 订阅

先更新数据库再更新缓存 和 先更新缓存再更新数据库直接放弃,因为缓存有时候并不是数据库的直接数据,有可能是经过一系列计算得来的数据,如果更新缓存,代价太大

先删缓存再更新数据库:
问题:当线程A要更新数据,先把缓存删了,这时候线程B要获取数据,从缓存中得不到数据,就到数据库取,但是数据库的数据还没有被线程A更新,于是B获取到了脏数据并且将脏数据重新注入缓存中,造成以后取得数据都是脏的
在这里插入图片描述

解决:1.加锁,将删缓存和更新数据库的操作视作一个整体,赋予原子性
2.延迟双删,A删缓存,更新数据库,然后再次删缓存。

优化:这里数据库如果是读写分离的话,写数据库和读数据库的同步有延迟,那线程B获取数据时发现缓存没数据会从读数据库读数据,但是读数据库有延迟还没更新,读的就是脏数据,我们可以通过强制线程B去读写数据库解决
在这里插入图片描述

先更新数据库再删缓存:
问题1:线程A要更新数据,先更新数据库数据,这时候线程B要获取数据,但是缓存还没被线程A删除,就直接获取到了脏缓存,不过这种情况概率很小
问题2:线程A要更新数据,先更新数据库数据,这时候出现错误,导致A删除缓存的操作没有执行,这样的话缓存之后就一直是脏数据了
解决:
1.加锁
2.通过消息队列存储缓存删除操作,当你出现错误,系统就将这次要删除的缓存放入消息队列,然后系统通过拉取消息队列中的元素再次对缓存进行删除。
在这里插入图片描述

优化:这里耦合度太高,可以通过消息队列拉取binlog日志,将要删除的元素放入消息队列中
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值