缓存和数据库不一致性的含义:在redis缓存没有自动失效和过期的长期时间内,redis中的数据和数据库中的数据一直都是不一样的。

在更新数据库数据的这段时间,redis和数据库数据不一致,是正常情况



首先要理解下面这个流程(这是前提,如果不是这个前提,则不考虑缓存和数据库一致性问题)

不论采用哪种方式解决缓存和数据库一致性问题,我们查询数据,都是下面这个流程

(1)先查缓存,缓存查到了数据,则直接结束

(2)缓存中没有数据,去查询数据库获取数据,然后会把数据写入到缓存中,再结束



在并发情况下,这时,有一个更新数据的线程到了,还有一个查询数据的线程到了

我们先看前面几种方案

(1)采用方案:先更新数据库,再删缓存

初始:缓存中没有数据 x ,只有数据库中有

查询数据线程先到,到第3步,线程因为其他原因阻塞了

(2)采用方案:先删缓存,再更新数据库

初始:缓存和数据库中都有 x = 1 

更新数据线程先到

以上两种方式,都有可能导致数据不一致性问题。



方案:先删缓存,再更新数据库

导致缓存和数据库数据不一致性问题的主要原因是:

更新数据库线程 删除缓存,被另一个查询数据线程 把旧的数据 重新缓存到了 redis中

我们如果等    查询数据线程 把旧的数据 重新缓存到了 redis中(即上图的第7步)完成后, 再删除缓存,就可以了,不过由于不知道 上图的第7步 多久会完成,所以需要延迟一段时间,这个过程也不会很久。

延迟的目的 ,就是为了等  查询数据线程 把旧的数据 重新缓存到了 redis中  完成。

如果不延迟,就直接二次删除缓存, 可能 第7步还没有开始(即查询数据线程  还没开始 把旧的数据 缓存到了 redis中)。这样我们第二次删除,啥也没删到。双删的动作都做完了,第7步又开始了。

特殊情况:如果 第7步 的开始时间,大于 延迟双删的时间,仍然会造成数据不一致性

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部