数据库缓存和缓存双写如何保证数据一致性问题

分布式缓存是现在很多分布式应用中必不可少的组件,但是用到了分布式缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题?

数据库缓存和缓存双写保证数据库一致性,它会根据不同场景和业务对数据的容忍度,做一个权衡。

下图是一个缓存获取和更新的一般业务逻辑:
在这里插入图片描述
读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。
更新的时候,先更新数据库,然后再删除缓存。

为什么是删除缓存,而不是更新缓存?

原因很简单,很多时候,在复杂点的缓存场景,缓存不单单是数据库中直接取出来的值。
比如可能更新了某个表的一个字段,然后其对应的缓存,是需要查询另外两个表的数据并进行运算,才能计算出缓存最新的值的。
另外更新缓存的代价有时候是很高的。
删除缓存,而不是更新缓存,就是一个 lazy 计算的思想,不要每次都重新做复杂的计算,不管它会不会用到,而是让它到需要被使用的时候再重新计算。

1. 最初级的缓存不一致问题及解决方案
先删除缓存,再修改数据库。如果数据库修改失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不一致。因为读的时候缓存没有,则读数据库中旧数据,然后更新到缓存中。

2. 比较复杂的数据不一致问题分析
在高并发场景下,数据发生了变更,先删除了缓存,然后去修改数据库,此时还没修改完成,其他请求进行获取,会先去读缓存,这时会发现缓存为空,去查询数据库,查到了修改前的旧数据,放入缓存中,随后数据变更的程序完成了数据库的修改,这种情况下会出现上述的数据库+缓存不一致的情况。
怎么解决
可以在数据库进行修改时,将读请求进行阻塞(设置一定的阻塞时间,超过该时间,可以进行缓存的降级处理),只有数据库修改成功后,才放行。

在存在主从延迟同步情况,可以使用双删策略,既先删除缓存-》修改数据库-》一定时间后再删除缓存。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值