如何保持数据库和缓存的一致性

更新缓存策略

失效:应用程序从cache取数据,没有得到,则从数据库取数据,然后将数据放入cache
命中:应用从cache取数据,若取到则返回
更新:把数据更新到数据库,然后使cache失效
借用网上两张图
这里写图片描述
这里写图片描述

有没有其他策略?

读操作容易理解,现在讨论一下写的操作

如果先使cache失效,后更新数据库,是否可行

这么做引发的问题是,如果A,B两个线程同时要更新数据,并且A,B已经都做完了删除缓存这一步,接下来,A先更新了数据库,C线程读取数据,由于缓存没有,则查数据库,并把A更新的数据,写入了缓存,最后B更新数据库。那么缓存和数据库的值就不一致了。

如果先把数据库更新,然后把cache更新(不是失效),是否可行

这么做引发的问题是,如果A,B两个线程同时做数据更新,A先更新了数据库,B后更新数据库,则此时数据库里存的是B的数据。而更新缓存的时候,是B先更新了缓存,而A后更新了缓存,则缓存里是A的数据。这样缓存和数据库的数据也不一致。

如果更新数据时,更新数据库成功,而失效cache时失败怎么解决?

1、对删除缓存进行重试,数据的一致性要求越高,我越是重试得快。
2、定期全量更新,简单地说,就是我定期把缓存全部清掉,然后再全量加载。
3、给所有的缓存一个失效期。(绝招,任何不一致,都可以靠失效期解决,失效期越短,数据一致性越高。但是失效期越短,查数据库就会越频繁。因此失效期应该根据业务来定)

不要缓存那些对数据一致性要求很高的数据

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值