【原创】分布式之数据库和缓存双写一致性方案解析(三)
正文
博主本来觉得,《分布式之数据库和缓存双写一致性方案解析》,一文已经十分清晰。然而这一两天,有人在微信上私聊我,觉得应该要采用
先删缓存,再更新数据库,再删缓存
这一方案作为缓存更新策略,而不是先更新数据库,再删缓存。并且搬出了两篇大佬的文章,《Cache Aside Pattern》,《缓存与数据库不一致,咋办?》,希望博主能加以说明。因为问的人太多了,所以才有了这篇文章的诞生。
正文
在开始这篇文章之前,我们先自己思考一下以下两个更新策略
方案一
(1)删缓存
(2)更数据库
(3)删缓存
方案二
(1)更数据库
(2)删缓存
大家看下面的文章前,自己先思考一下,方案一的步骤(1)有没有存在的必要?
先上一个结论:方案二存在的缺点,方案一全部存在,且方案一比方案二多一个步骤,所以应该选方案二。
下面,针对《Cache Aside Pattern》,《缓存与数据库不一致,咋办?》这两篇文章提出的论点,提出小小的质疑。这两篇文章认为方案二不行的原因,主要有以下两点
(1)方案二在步骤(2),出现删缓存失败的情况下,会出现数据不一致的情形,如下图所示
(2)方案二存在下面的主从同步,导致cache不一致问题,如下图所示
大致流程就是,线程A写,线程B读,会有以下流程出现
(1)缓存刚好失效
(2)线程A写入master数据库,slave还没同步
(3)线程B发现缓存失效,去slave读到旧值
(4)线程A删除缓存
(5)线程B把旧值放入缓存
然而大家发现了么,这两篇文章提出的反对意见,在该文作者自己所提出的方案一里头也是存在的?
(1)针对删缓存失败问题
方案一的步骤(3)也会可能出现删除缓存失败问题,可是作者没有加以详细说明。
(2)针对数据不一致问题
线程A写,线程B读,会有以下流程出现
(1)线程A删除缓存
(2)线程A写入master数据库,slave还没同步
(3)线程B发现缓存失效,去slave读到旧值
(4)线程A删除缓存
(5)线程B把旧值放入缓存
综上所述,我们应该选择方案二,而不是方案一。方案二存在的缺点,方案一全部存在,且方案一步骤上多了一步,增加了不稳定因素。
总结
该文章只是纠正了一下目前流传的观点的正确性,并没有针对任何人。技术的世界,只论技术。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?