博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分布式之数据库和缓存双写一致性方案解析(三)
阅读量:7039 次
发布时间:2019-06-28

本文共 1008 字,大约阅读时间需要 3 分钟。

hot3.png

正文

博主本来觉得,,一文已经十分清晰。然而这一两天,有人在微信上私聊我,觉得应该要采用

先删缓存,再更新数据库,再删缓存

这一方案作为缓存更新策略,而不是先更新数据库,再删缓存。并且搬出了两篇大佬的文章,,,希望博主能加以说明。因为问的人太多了,所以才有了这篇文章的诞生。

正文

在开始这篇文章之前,我们先自己思考一下以下两个更新策略

方案一

(1)删缓存

(2)更数据库

(3)删缓存

方案二

(1)更数据库

(2)删缓存

大家看下面的文章前,自己先思考一下,方案一的步骤(1)有没有存在的必要

先上一个结论:方案二存在的缺点,方案一全部存在,且方案一比方案二多一个步骤,所以应该选方案二。

下面,针对,这两篇文章提出的论点,提出小小的质疑。这两篇文章认为方案二不行的原因,主要有以下两点

(1)方案二在步骤(2),出现删缓存失败的情况下,会出现数据不一致的情形,如下图所示

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把旧值放入缓存

综上所述,我们应该选择方案二,而不是方案一。方案二存在的缺点,方案一全部存在,且方案一步骤上多了一步,增加了不稳定因素。

总结

该文章只是纠正了一下目前流传的观点的正确性,并没有针对任何人。技术的世界,只论技术。

转载于:https://my.oschina.net/hensemlee/blog/3005858

你可能感兴趣的文章
常用模块2
查看>>
0.Win8.1,Win10,Windows Server 2012 安装 Net Framework 3.5
查看>>
Silverlight C# 游戏开发:高深莫测却浅显易懂的游戏开发
查看>>
POJ Problem 3040 Allowance 【贪心】
查看>>
nose框架命令与特点
查看>>
杭电1272--小希的迷宫(并查集)
查看>>
ARC078 D.Fennec VS. Snuke(树上博弈)
查看>>
.Solr构建索引-查询索引
查看>>
centos服务器删除/usr目录怎么办
查看>>
在linux下使用curl访问 多参数url GET参数问题
查看>>
BZOJ3714:[PA2014]Kuglarz(最小生成树)
查看>>
when you debug and add breakpoints but pthread_setschedparam occurs!
查看>>
HashMap
查看>>
安装Pyecharts与ta-lib包
查看>>
html~table、table cell的使用
查看>>
PHP in_array效率问题
查看>>
Spring使用RowMapper将数据中的每一行封装成用户定义的类
查看>>
源代码的下载和编译
查看>>
树莓派+语音控制
查看>>
移动端开发 rem 单位使用问题
查看>>