当前位置:   article > 正文

Redis之缓存一致性_更新数据库后,再删除缓存,没有删除缓存之前,如果有请求读缓存,怎么办

更新数据库后,再删除缓存,没有删除缓存之前,如果有请求读缓存,怎么办

当数据库中的数据更改之后,Redis中的缓存数据也需要更改?

怎么保证Redis中的数据和数据库中数据一致呢?

首先说下,现阶段只能保证数据库和redis的最终一致性,无法保证其强一致性,无论怎么做都会存在一段时间的数据不一致。

1、删除还是更新Redis

更新会引发两个问题:
(1)并发引起的不一致,一个线程先更新了数据库却晚更新缓存,导致数据库和缓存的不一致,如果想要消除这种不一致,需要引入分布式锁
(2)资源利用率低,更新的key并不一定会立马读取到,将其写入到缓存中,会浪费空间。

删除的话不会有并发问题和资源利用低的问题,每次更新数据库后,重新拉取缓存就好了。

2、先删除缓存,后更新数据库

先删除缓存,然后更新数据库,可能会存在问题。

在删除缓存后,更新数据库成功之前,有其他线程读取数据,发现缓存为空,会读取数据库的旧值当作缓存的值。如果在此后的时间内,数据没有过期或者删除,数据会一直保持不一致。

这就引入了延迟双删

1、删除缓存
2、更新数据库
3、sleep,睡眠时间根据业务具体时间而定,约大于其他线程读数据 + 写缓存的时间
4、删除缓存

在这里插入图片描述

为什么还要延迟呢?

因为线程之间存在调度,有可能其他线程读取完数据后,然后一直没有得到执行机会,也就是没有写缓存。

那么如果在更新完数据库后,立即删除缓存的话,刚删除完缓存,然后其他线程得到执行机会了,又将就缓存写入了。。还是数据不一致!

所以要等待约大于线程读取数据+写缓存的时间,这个时间是需要统计的。

延迟双删 也会 出现删除缓存失败的情况,所以还是直接用 先更新数据库,后删除缓存的方案。

3、先更新数据库,后删除缓存

先更新数据库,然后删除缓存会出现什么问题呢?

删除缓存有可能会执行失败,如果执行失败并且不做处理的话,那么数据也会出现不一致!

所以引入消息队列来存放对应的删除命令,消息队列提供了重试和消息可靠性,可以保证删除缓存的执行。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/368018
推荐阅读
相关标签
  

闽ICP备14008679号