延迟双删介绍
这篇文章资料来自于网络,是对部分知识整理,这里只是记录一下,仅供参考
1、何为延时双删
延迟双删(Delay Double Delete)是一种在数据更新或删除时为了保证数据一致性而采取的策略。这种策略通常用于解决数据在缓存和数据库中不一致的问题。
具体来说,在某些场景下,我们需要先更新或删除数据库中的数据,然后再更新或删除缓存中的数据,以保证数据的一致性。但在某些情况下,由于网络延迟、服务器故障或其他原因,可能导致缓存中的数据更新或删除失败,从而导致数据库和缓存中的数据不一致。
值得注意的是,不管哪种方案,都避免不了Redis存在脏数据的问题,只能减轻这个问题,要想彻底解决,得要用到同步锁和对应的业务逻辑层面解决。
2. Q & A
- 延时双删有啥作用?
- 为了使得缓存和数据库数据最终一致。
- 为什么要删除缓存数据,而不是修改?
- 如果是修改,并发修改数据场景,先改缓存的有可能后改库,先改库的也可能后改缓存。
- 为什么要睡眠延时一段时间?
- 读写分离是解决高并发比较有效的方案,但是缓存/库的主从是异步更新数据的。
- 睡眠一段时间,就是为了库和缓存能实现数据主从同步。
- 延时双删能确保缓存和数据库最终一致吗?
- 不能确保。
- 只能通过延时最大程度上提高数据的最终一致的概率。
- 如果缓存和数据库负载很高,主从同步很慢,很有可能不能在延时的时间内实现同步。
- 脏读怎么办?
- 确实有这问题,要知道这是最终一致,并不是强一致,最后一次删除就是为了最终一致^_^!
- 所以要确保你的业务场景能忍受数据最终一致的缺陷,实在不行你读主库呗。
- 优化业务逻辑的设计,具体请参考下文的:
通过业务设计加强数据一致性章节。
- 为什么要有第一次删除缓存?
1> 删除脏读。
2> 提前实现其它操作的数据最终一致。- 延时双删有 4 个步骤,全部执行完才能实现数据最终一致,可能会比较慢!
- 延时双删第三个步骤延时等待是比较漫长的,有可能在等待时间超时前,数据就已经完成同步了。在并发环境中,如果其它并发环节增加第一次删除,可能会提前实现前面操作的数据最终一致,不用等延时双删四个步骤都完成。
参考
https://juejin.cn/post/7540494849926840383
https://blog.csdn.net/Aqting/article/details/131880734
https://zhuanlan.zhihu.com/p/467410359
