缓存和数据库不一致性的含义:在redis缓存没有自动失效和过期的长期时间内,redis中的数据和数据库中的数据一直都是不一样的。
在更新数据库数据的这段时间,redis和数据库数据不一致,是正常情况
首先要理解下面这个流程(这是前提,如果不是这个前提,则不考虑缓存和数据库一致性问题)
不论采用哪种方式解决缓存和数据库一致性问题,我们查询数据,都是下面这个流程
(1)先查缓存,缓存查到了数据,则直接结束
(2)缓存中没有数据,去查询数据库获取数据,然后会把数据写入到缓存中,再结束
在并发情况下,这时,有一个更新数据的线程到了,还有一个查询数据的线程到了
我们先看前面几种方案
(1)采用方案:先更新数据库,再删缓存
初始:缓存中没有数据 x ,只有数据库中有
查询数据线程先到,到第3步,线程因为其他原因阻塞了
(2)采用方案:先删缓存,再更新数据库
初始:缓存和数据库中都有 x = 1
更新数据线程先到
以上两种方式,都有可能导致数据不一致性问题。
方案:先删缓存,再更新数据库
导致缓存和数据库数据不一致性问题的主要原因是:
更新数据库线程 删除缓存后,被另一个查询数据线程 把旧的数据 重新缓存到了 redis中
我们如果等 查询数据线程 把旧的数据 重新缓存到了 redis中(即上图的第7步)完成后, 再删除缓存,就可以了,不过由于不知道 上图的第7步 多久会完成,所以需要延迟一段时间,这个过程也不会很久。
延迟的目的 ,就是为了等 查询数据线程 把旧的数据 重新缓存到了 redis中 完成。
如果不延迟,就直接二次删除缓存, 可能 第7步还没有开始(即查询数据线程 还没开始 把旧的数据 缓存到了 redis中)。这样我们第二次删除,啥也没删到。双删的动作都做完了,第7步又开始了。
特殊情况:如果 第7步 的开始时间,大于 延迟双删的时间,仍然会造成数据不一致性
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » redis缓存和数据库一致性的解决方案-延迟双删
发表评论 取消回复