如何浅析数据库与缓存的双写一致性问题

技术如何浅析数据库与缓存的双写一致性问题今天就跟大家聊聊有关如何浅析数据库与缓存的双写一致性问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。缓存由于其高并发和高

今天,我将与您讨论如何分析数据库和缓存之间的双写一致性。很多人可能不太了解。为了让大家更好的了解,边肖为大家总结了以下内容。希望你能从这篇文章中有所收获。

缓存因其高并发性和高性能而被广泛应用于项目中。阅读过程如下:

如何浅析数据库与缓存的双写一致性问题

双写一致性有以下三个要求:

缓存无法读取脏数据。

缓存可能会读取过时的数据,但最终的一致性应该在可容忍的时间内实现。

这个可容忍的时间越短越好。

为了同时满足上述三个要求,读请求和写请求可以序列化并串入内存队列,以确保不会出现不一致。但是序列化后,系统的吞吐量会大大降低,支持在线请求的机器会比正常多几倍。

如何浅析数据库与缓存的双写一致性问题

因此,在这里,我们讨论三种常见的方法:

首先更新数据库,然后更新缓存

在更新数据库之前删除缓存。

首先更新数据库,然后删除缓存。

1. 先更新数据库,再更新缓存

这种方法普遍受到大家的反对,原因有以下两个:

原因一:线程安全角度。

如果同时请求A和请求B更新,将出现:

一个线程更新了数据库。

线程更新了数据库

线程更新了缓存

一个线程更新了缓存。

这说明请求A更新缓存应该早于请求B更新缓存,但是由于网络等原因,B比A更早更新缓存,这就导致数据脏了,所以不考虑。

同理,“先更新缓存,再更新数据库”的方案也会造成数据脏,所以不考虑。

2.原因:业务场景视角。

有以下两点:

如果您的业务需求中有更多的数据库写入场景和更少的数据读取场景,这种方案将导致在读取数据之前频繁更新缓存,从而浪费性能。

如果您写入数据库的值没有直接写入缓存,它们将在一系列复杂的计算后写入缓存。那么,每次写入数据库后,再次计算写缓存的值无疑是对性能的浪费。显然,删除缓存更合适。

如果必须更新缓存,请考虑将版本号添加到缓存的数据中。

如何浅析数据库与缓存的双写一致性问题

2. 先删除缓存,再更新数据库

这个方案也会导致不一致。如果同时请求A和请求B更新,将出现:

请求写入和删除缓存

查询发现缓存不存在。

请求查询数据库以获取旧值。

将旧值写入缓存的请求

向数据库写入新值的请求。以上情况会导致不一致。此外,如果不采用为缓存设置到期时间的策略,数据将总是脏的。

如何浅析数据库与缓存的双写一致性问题

解决方案:

请先删除缓存。

再次写入数据库(这两个步骤与之前相同)

休眠一定时间(如1秒或200毫秒),再次删除缓存。这样,可以再次删除缓存的脏数据。

然而,这种解决方案仍然会影响吞吐量,因为需要休眠线程。

3. 先更新数据库,再删除缓存

是很多项目采用的方案。让我们看看它是否安全。

假设有两个请求,一个用于查询操作,另一个用于b更新操作,将出现以下情况。

缓存刚刚失败。

查询数据库的请求,旧值

向数据库中写入新值的请求

删除缓存的请求

请求将找到的旧值写入缓存。

因此,产生了脏数据。然而,上述情况假设写请求比读数据库中的请求更快。事实上,在工程上,数据库的读操作比写操作快得多。

要么通过2PC或者Paxos协议保证一致性,要么想尽一切办法降低并发时脏数据的概率,可能是因为2PC太慢,Paxos太复杂。综合考虑,脸书选择了这第三种方案。

00-1010启动订阅程序,订阅数据库的binlog,获取需要操作的数据。在应用程序中,启动另一个程序从这个订阅程序获取信息并删除缓存。

看完以上内容,你对如何分析数据库和缓存的双写一致性有了更好的理解吗?如果您想了解更多知识或相关内容,请关注行业资讯频道,感谢您的支持。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/129606.html

(0)

相关推荐

  • ftp命令中binary mode与ascii mode的区别是怎样的

    技术ftp命令中binary mode与ascii mode的区别是怎样的这篇文章给大家介绍ftp命令中binary mode与ascii mode的区别是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能

    攻略 2021年11月20日
  • 对数的导数,有人会自然对数求导推导吗,急用

    技术对数的导数,有人会自然对数求导推导吗,急用绘制出图象对数的导数,可以看出在x=0的时候是存在导数的,x=1不可导,x=-1未定义。假如用对数求导法:
    看到lnx和1/x,我知道为什么了。
    在x=0的时候,对数求导法当

    生活 2021年10月28日
  • MapReduce执行流程

    技术MapReduce执行流程 MapReduce执行流程数据处理总流程
    MapReduce计算框架体现的是一个分治的思想。及将待处理的数据分片在每个数据分片上并行运行相同逻辑的map()函数,然后将每

    礼包 2021年11月9日
  • 安装Neo4j数据库

    技术安装Neo4j数据库 安装Neo4j数据库安装Neo4j之前,需要先安装JDK
    两者对应关系:Neo4j version3.5 使用java1.8;Neo4j version4.0+ 目前只支持JD

    礼包 2021年10月28日
  • 【go笔记】使用标准库flag解析命令行参数

    技术【go笔记】使用标准库flag解析命令行参数 【go笔记】使用标准库flag解析命令行参数使用标准库flag解析命令行参数前言
    Go语言标准库中提供了一个包flag可以解析命令行参数。
    示例代码:文

    礼包 2021年12月13日
  • html中一个表格由哪些部分组成

    技术html中一个表格由哪些部分组成本篇内容主要讲解“html中一个表格由哪些部分组成”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“html中一个表格由哪些部分组成”吧!

    攻略 2021年11月17日