文档章节

分布式之数据库和缓存双写一致性方案解析(三)

hensemlee
 hensemlee
发布于 01/25 11:40
字数 909
阅读 50
收藏 0

正文

博主本来觉得,《分布式之数据库和缓存双写一致性方案解析》,一文已经十分清晰。然而这一两天,有人在微信上私聊我,觉得应该要采用

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

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

正文

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

方案一

(1)删缓存

(2)更数据库

(3)删缓存

方案二

(1)更数据库

(2)删缓存

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

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

下面,针对《Cache Aside Pattern》《缓存与数据库不一致,咋办?》这两篇文章提出的论点,提出小小的质疑。这两篇文章认为方案二不行的原因,主要有以下两点

(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://www.cnblogs.com/rjzheng/p/9302609.html

hensemlee
粉丝 9
博文 84
码字总数 54502
作品 0
徐汇
程序员
私信 提问
数据库之架构:主备+分库?主从+读写分离?

一、数据库架构原则 高可用 高性能 一致性 扩展性 二、常见的架构方案 方案一:主备架构,只有主库提供读写服务,备库冗余作故障转移用    jdbc:mysql://vip:3306/xxdb 高可用分析:高可用...

尜尜人物
2018/08/07
0
0
【原创】分布式之数据库和缓存双写一致性方案解析(三)

正文 博主本来觉得,《分布式之数据库和缓存双写一致性方案解析》,一文已经十分清晰。然而这一两天,有人在微信上私聊我,觉得应该要采用 这一方案作为缓存更新策略,而不是先更新数据库,再...

孤独烟
2018/07/12
0
0
分布式数据库与缓存双写一致性方案解疑

作者介绍 孤独烟,中国平安研发工程师,目前负责规则云平台架构设计以及需求研发工作。毕业后一直从事Java开发工作,在Web开发、架构设计上有多年的实战经验。在MySQL性能优化、JVM调优、分布...

孤独烟
2018/06/01
0
0
分布式之数据库和缓存双写一致性方案解析(二)

引言 该文是对《分布式之数据库和缓存双写一致性方案解析》,一文的补充。博主在该文中,提到了这么一句话 应该没人问我,为什么没有先更新缓存,再更新数据库这种策略。 博主当时觉得,这种...

hensemlee
01/23
0
0
缓存与数据库双写一致最佳解决方案分析

如今利用缓存来提高查询效率已被广泛用在生产环境,查询数据的一般流程如下所示 如果数据在缓存里边有,则直接从缓存取数据返回。 如果缓存中没有想要的数据,则先去查询数据库,然后将数据库...

谢随安
03/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【redis】spring boot利用redis的Keyspace Notifications实现消息通知

前言 需求:当redis中的某个key失效的时候,更新key对应数据在数据库的状态 1、修改redis.conf 安装的redis服务默认是: notify-keyspace-events "",修改成 notify-keyspace-events Ex; 位置...

时刻在奔跑
10分钟前
1
0
IT基础设施中的人工智能可以改变工作的方式

  如今,减少人工智能的宣传和炒作已成为IT领导者的主要工作。提供有关人工智能在何处以及如何将其添加到IT基础设施的深入指南将会提供帮助。   很多技术提供商正在投入巨资,将人工智能...

琴殇的
11分钟前
0
0
vue cli3创建测试打包环境(通过development、production、alpha指定不同的接口地址)

参考地址 前言:项目一般有开发环境,测试环境,生产环境;vue cli内置有开发和生产环境,可以用process.env.NODE_ENV区分,有时候我们和后台同事需要本地连接调试代码,又需要连接测试环境调...

hkaikai
17分钟前
1
0
360安全浏览器龙芯、飞腾、兆芯版

主页https://browser.360.cn/se/linux/ 龙芯 http://down.360safe.com/gc/browser360-cn-stable-10.0.2001.0-1.mips64el.rpm http://down.360safe.com/gc/browser360-cn-stable_10.0.2001.0......

gugudu
17分钟前
37
0
访问JSP时,浏览器显示为

问题: <servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param>......

器石_
21分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部