数据库与缓存的一致性

news2025/8/12 7:42:29

数据库与缓存的一致性

一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。

  • 强一致性:这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大
  • 弱一致性:这种一致性级别约束了系统在写入成功后,不承诺立即可以读到写入的值,也不承诺多久之后数据能够达到一致,但会尽可能地保证到某个时间级别(比如秒级别)后,数据能够达到一致状态
  • 最终一致性:最终一致性是弱一致性的一个特例,系统会保证在一定时间内,能够达到一个数据一致的状态。这里之所以将最终一致性单独提出来,是因为它是弱一致性中非常推崇的一种一致性模型,也是业界在大型分布式系统的数据一致性上比较推崇的模型

三个经典的缓存模式

缓存可以提升性能、缓解数据库压力,但是使用缓存也会导致数据不一致性的问题。一般我们是如何使用缓存呢?有三种经典的缓存使用模式:

  • Cache-Aside Pattern(旁路缓存模式)
  • Read-Through/Write-through(读写穿透模式)
  • Write-behind

Cache-Aside Pattern(旁路缓存模式)

Cache-Aside Pattern,即旁路缓存模式,它的提出是为了尽可能地解决缓存与数据库的数据不一致问题。

读流程:

  1. 读的时候,先读缓存,缓存命中的话,直接返回数据
  2. 缓存没有命中的话,就去读数据库,从数据库取出数据,放入缓存后,同时返回响应。

写流程:

更新的时候,先更新数据库,然后再删除缓存

image-20221117132003269

Read-Through/Write-Through(读写穿透)

Read/Write-Through模式中,服务端把缓存作为主要数据存储。应用程序跟数据库缓存交互,都是通过抽象缓存层完成的。

Read-Through的简要流程如下

  1. 从缓存读取数据,读到直接返回
  2. 如果读取不到的话,从数据库加载,写入缓存后,再返回响应。

image-20221117132518484

Write-Through模式下,当发生写请求时,也是由缓存抽象层完成数据源和缓存数据的更新,流程如下:

image-20221117132630398

Write-behind (异步缓存写入)

Write-behind 跟Read-Through/Write-Through有相似的地方,都是由Cache Provider来负责缓存和数据库的读写。它们又有个很大的不同:Read/Write-Through是同步更新缓存和数据的,Write-Behind则是只更新缓存,不直接更新数据库,通过批量异步的方式来更新数据库。

image-20221117132816669

操作缓存的时候,到底是删除缓存呢,还是更新缓存?

日常开发中,我们一般使用的就是Cache-Aside模式。那为什么是先删除缓存而不是直接更新缓存呢?

下面来看这个例子

image-20221117133000241

线程A发起写请求

线程B也发起写请求

下面进行了这些操作

1、线程A更新数据库

2、线程B更新数据库

3、线程B更新了缓存

4、线程A更新了缓存

从上面四步的结果可以看出,缓存更新完之后,缓存存在的值就是A的值(也就是老的数据,而新的值B的缓存值就被覆盖了,并且此时数据库与缓存之间的值也出现了不同一的状态)

更新缓存相对于删除缓存,还有两点劣势:

  • 如果写入的缓存值,是经过复杂计算才得到的话。更新缓存频率高的话,就浪费性能啦。
  • 在写数据库场景多,读数据场景少的情况下,数据很多时候还没被读取到,又被更新了,这也浪费了性能(实际上,写多的场景,用缓存也不是很划算的)

双写的情况下,先操作数据库还是先操作缓存?

Cache-Aside缓存模式中,有些小伙伴还是会有疑问,在写请求过来的时候,为什么是先操作数据库呢?为什么不先操作缓存呢?

image-20221117133440787

假设有A、B两个请求,请求A做更新操作,请求B做查询读取操作。

  1. 线程A发起一个写操作,第一步del cache(因为现在假设写操作是先操作缓存,也就是删除缓存)
  2. 此时线程B发起一个读操作,cache miss,缓存丢失
  3. 线程B继续读DB,读出来一个老数据
  4. 然后线程B把老数据设置入cache
  5. 线程A写入DB最新的数据
  6. 此时就会出现缓存中的数据与数据库中的数据不一致的状况

相关链接

美团二面:Redis与MySQL双写一致性如何保证?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/15199.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows系统怎么加密文件夹?

Windows系统是目前使用人数最多的电脑系统,那么你知道在Windows系统上怎么加密文件夹吗?下面这篇文章,将向大家介绍两种Windows系统文件夹加密的方法,希望对你有所帮助。 方法一:使用超级加密3000进行加密 1、打开超级…

C和C++导出DLL后在Csharp中调用函数名的差异

参考链接:cc​​​​​​​在Unity中调用C代码:出现EntryPointNotFoundException的解决办法: - 知乎 (zhihu.com) __declspec(dllexport)的位置问题 - 岚之山 - 博客园 (cnblogs.com) 如果是报如下异常 System.EntryPointNotFoundExceptio…

【GlobalMapper精品教程】017:KML generator快速将坐标转为KML文件

本文介绍KML generator软件,并快速将坐标转为KML文件的使用方法,并用globalmapper中打开kml文件加以验证。本专栏配套完整的案例数据包,请打开data017.rar获取软件及数据。 文章目录 1. KML文件介绍2. kml generator软件介绍2.1 单点KML制作2.2 Excel数据KML制作2.3 文本文件…

【模电实验】【超值1 + 1】【验证性实验——分立元件“OTL“功率放大器实验】【验证性实验——分立元件稳压电源实验】

实验9-1 验证性实验——分立元件"OTL"功率放大器实验 Multisim仿真 编辑分立元件OTL功率放大器的仿真电路如下: 静态工作点的调试与仿真如下: 发射极基极集电极T1277mV998mV5.66VT26.38V6.93V12VT36.20V5.66V0V 交越失真分析如下&#xff1a…

【Linux】OS和进程概念

文章目录1.冯诺依曼体系结构2. 操作系统(Operator System )概念总结3. 进程描述进程-PCBtask_struct-PCB的一种task_ struct内容分类见见进程1.冯诺依曼体系结构 冯诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起…

微机原理实验:字符转换为ASCII码

随记! 要求: 1. 将指定数据区的字符串数据以ASCII码形式显示在屏幕上,并通过DOS功能调用完成必要提示信息的显示。 2. 在屏幕上显示自己的学号姓名信息。 3. 循环从键盘读入字符并回显在屏幕上,然后显示出对应字符的AS…

JS高级(四):正则表达式、常见的特殊字符、案例、预定义类、正则替换

JavaScript高级(四)一、正则表达式1.它有什么作用?2.创建正则表达式(1)利用RegExp对象来创建(2)利用字面量创建3.测试正则表达式二、特殊字符1.^和$匹配开头和结尾2.[ ]字符类3.量词符三、用户名…

有线热电偶温度验证系统

在本文中,我们将介绍使用有线热电偶温度验证系统的一些优势,并将虹科Ellab的E-Val™ Pro与市场上可用的传统有线系统(验证仪)进行比较分析。 虹科E-Val Pro是一个高度直观的基于电缆的系统。设计用于各种应用,如冻干、…

数字化时代,企业为什么需要商业智能BI?

数字化时代的到来,数据资产已经成为第五大生产要素,数据是企业生产、经营和决策的重要因素。为提升企业经营状况的感知能力,数据分析应运而生,数据获取的及时性、准确性也需要更加系统些,此时,成熟的商业智…

EasyExcel代码层面设置写出的Excel样式、以及拦截器策略的使用、自动列宽设置、EasyExcel默认设置详解

一、概述 虽然EasyExcel已经提供了一系列注解方式去设置样式。 但是如果没有实体类,或者想要更精确的去设置导出文件的Excel样式的时候就需要在代码层面去控制样式了。 二、使用已有拦截器自定义样式 主要步骤: 创建Excel对应的实体对象创建一个sty…

注意 ! !|95% 的应用程序中发现错误配置和漏洞

业内权威机构 Synopsys 最近发布了一项研究报告,结果表明在进行4300次测试后,发现95%的应用程序中都至少都有一个影响安全的漏洞或配置错误,其中高危漏洞占20%,严重漏洞则占4.5%。在此次研究中,82% 的测试目标是 Web 应…

调用链路上千条,如何观测 Nacos 的运行状态

作者:涌月 背景 随着近年来微服务体系发展,微服务上下游链路的越来越复杂,在阿里云的线上实践场景中,我们发现使用微服务架构的公司的业务动辄会出现上千条调用链路,排查问题代价巨大。 在这种背景下,阿…

灰鸽子木马特征值免杀

文章目录木马特征值免杀一. 木马特征值免杀0x01. 灰鸽子配置生成木马0x02. 使用MyCCL复合特征码定位器反复缩小目标进行定位0x03. 直到定位到很小的区间0x04. 用工具将文件偏移地址0009B9C3转换成内存地址0049C5C30x05. 使用OD跳转特征值语句的执行顺序以实现免杀0x06. 将修改后…

【深入浅出Spring6】第五期——循环依赖和反射机制

一、Bean的循环依赖问题 什么是循环依赖? 类似于A依赖B,B又依赖A,这样就构成了依赖闭环 需求:我们创建两个类,彼此内置对方为私有属性,我们查看是否可以正常输出 $ singleton setter产生的循环依赖 编写我…

(八)Bean的生命周期

文章目录环境什么是Bean的生命周期为什么要知道Bean的生命周期Bean生命周期之5步Bean生命周期之7步Bean生命周期之10步三个点位详解:点位1点位2点位3演示程序Bean的作用域不同,管理方式不同自己new的对象如何让Spring管理上一篇:(…

UE4 回合游戏项目 20- 添加人物被攻击的动画

在上一节(UE4 回合游戏项目 19- 添加血量UI)基础上继续添加人物被攻击时播放被攻击动画的功能。 效果:(当玩家被攻击时,播放相应的受到伤害的动画) 步骤: 1.打开“1lantu”,在事件图…

艾美捷试剂级SM-102解决方案

LNP是一种多组分系统,通常由可电离脂质或阳离子类脂质化合物、辅助脂质、胆固醇、保护剂聚乙二醇-脂质共轭物组成。 脂质纳米颗粒(LNP)是mRNA药物常用的载体。目前,BioNTech/辉瑞和 Moderna的mRNA疫苗都采用LNP作为运输载体&#…

SpringMVC ---- RESTful

SpringMVC ---- RESTful1. RESTful简介a>资源b>资源c>资源2. RESTful的实现3. HiddenHttpMethodFilter1. RESTful简介 REST:Representational State Transfer,表示层资源状态转移。 a>资源 资源是一种看待服务器的方式,即&…

ECM:敏感文档控制的秘密武器

ECM:敏感文档控制的秘密武器 您的企业每天都会创建和处理数百个文档。这些文件详细说明了企业流程、产品规格,并为其他员工和客户提供指导。 每天都有大量文档流入和流出您的组织,有一件事始终保持不变:那就是组织内部和外部的…

Docker零基础快速入门(通俗易懂)

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 Docker一、安装Docker二、配置镜像加速器三、Docker服务命令四、Docker镜像命令五、Docker容器命令六、Docker容器数据卷七、Docker部署应用…