缓存与数据库相关问题

更新数据库的同时更新缓存

  • 更新缓存还是删除缓存?
    更新缓存:每次更新数据库都更新缓存,无效写操作较多。比如数据库更新了100次,缓存也更新了100次,但这时很少有请求是查询请求,缓存无效写操作较多。-----写多读少的场景

  • 删除缓存
    更新数据库时让缓存失效,查询时再更新缓存。比如数据库更新了100次,缓存只删除1次,等到有查询请求进来时,先查询数据库,在更新值

先删除缓存,再操作数据库
在这里插入图片描述
上图是正常情况,缓存和数据库中刚开始值为10,线程1先删除缓存,缓存里面没有值了,在更新数据库,v=20;线程2进来查询缓存,缓存为空,查询数据库,将查到的20写入缓存。此时缓存和数据库中的值保持一致,都是20
在这里插入图片描述上图是另外1种情况,缓存和数据库中的值初始都为10,线程1先删除缓存,此时缓存里面的值为空,想更新数据库的时候,线程2进来了,抢占到cpu的时间片(由于查询缓存操作比更新数据库操作更轻量,这种情况很有可能发生),先查询缓存,缓存为空,查询数据库,得到值为10,写入缓存,缓存里的值变为10,此时线程1开始工作,更新数据库,将v=20。此时,缓存里面的值为10,数据库中值为20,缓存与数据库中值不一致

先操作数据库,再删除缓存
在这里插入图片描述
缓存与数据库中初始值为10,线程2先更新数据库,将v=20,删除缓存,线程1此时抢占到cpu的使用权,开始查询缓存,未命中,查询数据库,值为20,写入缓存,最终缓存和数据库中的值都为20
在这里插入图片描述
缓存和数据库中初始值为10,线程1开始查询缓存,未命中(缓存里面的值有可能刚过期),查询数据库,查到的值为10,线程2此时进来,更新数据库,v=20,删除缓存,线程1抢占到cpu使用权,将查询到的10写入缓存。此时,数据库中为20,缓存里值为10,两者数据不一致(这种情况发生的可能性不高,1.查询缓存时,缓存刚好失效 2.线程1查询数据库准备写入缓存时,(写入缓存的操作是微秒级别的,很快的),刚好线程2过来进行更新操作(更新数据库的操作相对耗时))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值