面试官:高并发场景下,你们是怎么保证数据的一致性的?图文详解

news2024/11/19 9:26:28

面试的时候,总会遇到这么一个场景。

1. 场景分析

面试官:你们的服务的QPS是多少?

我:我们的服务高峰期访问量还挺大的,大约是3万吧。

面试官:这么大的访问量,你们的服务器能撑住吗?有加缓存吗?

我:有的,我们使用了Redis做缓存,接口优先查询缓存,缓存不存在,才访问数据库。这样可以减少数据库访问压力,加快查询效率。

面试官:一份数据存储在两个地方,更新数据的时候,你们是怎么保证数据的一致性的?

看到了吧,好的面试官一般不直接问你数据一致性的解决方案,而是循循善诱,结合具体的使用场景,再问你解决方法。如果你没做过这方面,没有线上的实战经验,一般很难回答的有条理性、有思考性。

保证数据一致性,一般有这4种方法:

  1. 先更新缓存,再更新数据库。
  2. 先更新数据库,再更新缓存。
  3. 先删除缓存,再更新数据库。
  4. 先更新数据库,再删除缓存。

每种方案都详细的讨论一下:

2. 解决方案

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

如果同时来了两个并发写请求,执行过程是这样的:

img

  1. 写请求1更新缓存,设置age为1
  2. 写请求2更新缓存,设置age为2
  3. 写请求2更新数据库,设置age为2
  4. 写请求1更新数据库,设置age为1

执行结果就是,缓存里age被设置2,数据库里的age被设置成1,导致数据不一致,此方案不可行。

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

如果同时来了两个并发写请求,执行过程是这样的:

  1. 写请求1更新数据库,设置age为1
  2. 写请求2更新数据库,设置age为2
  3. 写请求2更新缓存,设置age为2
  4. 写请求1更新缓存,设置age为1

执行结果就是,数据库里age被设置2,缓存里的age被设置成1,导致数据不一致,此方案不可行。

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

如果同时来了两个并发读写请求,执行过程是这样的:

img

  1. 写请求删除了缓存
  2. 读请求查询缓存没数据,然后查询数据库,再把数据写到缓存中
  3. 写请求更新数据库

执行结果是,缓存中是旧数据,而数据库里是新数据,导致数据不一致,此方案不可行。

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

这种方案,在并发写的时候,不会出问题。因为都是先更新数据库再删除缓存,不会出现不一致的情况。

但是在并发读写的时候,还是有可能出现数据不一致。

  1. 读请求查询缓存没数据,然后查询数据库
  2. 写请求更新数据库,删除缓存
  3. 读请求回写缓存

执行结果是,缓存中是旧数据,而数据库里是新数据,导致数据不一致。

其实这种情况出现的概率很低,写缓存比写数据库快出几个量级,读写缓存都是内存操作,速度非常快。

遇到了这种极端场景,我们也需要做一下兜底方案,缓存都要设置过期时间。这种方案属于数据的弱一致性和最终一致性,而不是强一致性。

3. 总结与思考

有读者可能会好奇,为什么不在更新缓存和数据库方法上加上事务注解,实现强一致性,这么哪种方案都不会有问题。

是的,当我们的服务只在一台机器上,加本地事务是可行的。但是工作中,我们会把一个服务部署到几十台、上百台机器上,有时候为了应对更极端的查询请求,又在Redis缓存加一层本地缓存,这时候我们再用本地事务是不起作用的。

一份数据在多台机器上,存在多个副本,为了实现强一致性,我们也可以使用分布式事务。这样一来更新缓存操作将会变得非常复杂,得不偿失。

但是在另外的一些场景,比如更新订单状态、更新用户资产,这种场景,我们无论付出多大代价也要实现数据的强一致性,具体实现方案一般有以下几种:

  1. 二阶段提交
  2. TCC
  3. 本地消息表
  4. MQ事务消息
  5. 分布式事务中间件

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

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

相关文章

自学unity,该不该阻止?

看清现状,展望未来 进入游戏公司前 进入游戏行业一大契机:在校生身份。各大厂同一个岗位对校招和社会招聘的要求不是一个维度。从学校校招生的身份毕业成为社会人,按照再给两年来算,两年后技术会如何革新?各大公司的招…

【苹果推群发iMessage推】软件安装个性化必要高度 - (void) updateListH

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

MySQL8.0.26—Linux版安装详细教程

❤ 作者主页:Java技术一点通的博客 ❀ 个人介绍:大家好,我是Java技术一点通!( ̄▽ ̄)~* 🍊 记得关注、点赞、收藏、评论⭐️⭐️⭐️ 📣 认真学习,共同进步!&am…

Network error: Connection refused

Network error: Connection refused1 问题的现象2 确认vmware ubuntu侧ssh是否启动2.1 确认ubuntu侧ssh的状态2.2 重启ssh服务2.3 安装ssh1 问题的现象 在用mobaXterm ssh去链接vmware虚拟机ubuntu时一直报下面的错误。 出现该问题之后我做了下面的检测: 检查vmw…

腾讯云年终选购云服务器攻略!

随着云计算的快速发展,很多用户都选择上云,上运中最常见的产品就是云服务器CVM和轻量应用服务器了,那么怎么选购最优惠呢,这篇文章将介绍新老用户选购腾讯云服务器的几个优惠方法。 一、买赠专区 第一个介绍的就是买赠专区&…

在kubernetes中对pod使用tcpdump+wireShark进行抓包

1.查看pod信息,获得pod所在的宿主机 kubectl get pod -n demo -o wide 2.获取宿主机的详情 kubectl get node zeebe.node1 -o wide 3.ssh连接到宿主机 ssh 用户名10.10.11.202 4.查看容器ID,使用POD名称中的关键字进行查找 docker ps|grep nodeapp 5…

java计算机毕业设计ssm图书馆预约管理系统txke6(附源码、数据库)

java计算机毕业设计ssm图书馆预约管理系统txke6(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xf…

【Shell 脚本速成】07、Shell 流程控制——if 判断语句

目录 一、if 介绍 二、单 if 语法 三、if…else 语句 四、if…elif…else 五、if 嵌套 if 5.1 使用 if 嵌套 if 的方式判断两个整数的关系 5.2 写一个nginx安装初始化脚本 六、if 语句与 shell 运算 6.1 与文件存在与否的判断 6.2 文件权限相关的判断 6.3 整数之间…

【数据结构】建堆的方式、堆排序以及TopK问题

建堆的方式、堆排序以及TopK问题1、建堆的两种方式1.1 向上调整建堆1.2 向下调整建堆2、堆排序3、TopK问题4、建堆、堆排序、TopK问题全部代码1、建堆的两种方式 我们知道,堆是二叉树的一种,二叉树的建立是借助结构体与数组完成的(通过在结构…

扫描电镜下的人体感官结构,超震撼

我们对自己的感官最熟悉不过了,但是如果把这些器官放大一千倍一万倍,你还能分辨出来吗?能做到这一点的不是普通的光学显微镜,而是电子显微镜。 电子显微镜可以将物体放大近300000倍,其分辨率可达1纳米(10-9…

Minio学习

目录 一、概述 1、Minio介绍 2、Minio的基础概念 3、Minio安装 3.1、Docker容器中安装 3.2、Windows运行安装 4、分布式Minio优势 数据保护 高可用 一致性 5、Minio客户端使用 6、SpringBoot工程引入Minio 一、概述 Minio分布式文件系统。 Minio是一个基于Apache…

客服回复差评的话术模板

当店铺出现差评时,客服首先要去与客户进行沟通,帮助客户解决问题,尽可能去消除差评;如果客户不愿意沟通,无法消除差评的情况下,客服也要及时对差评进行回复。 前言 对于开网店的店主来说,客户…

如何搭建一个自己的音乐服务器

点赞再看,动力无限。 微信搜「 程序猿阿朗 」。 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章。 最近发现,经常用的网易云音乐,有很多歌曲下架了,能听的越来越少了;…

【电气安全】安科瑞电气火灾监控系统在江苏某大学中设计与应用

摘要:本文以安科瑞电气火灾系统在江苏大学科技园的应用为案例,介绍电气火灾系统实现对现场设备的系统集成,数据的采集、传输以及存储,验证了该系统的功能及实用性。 关键词:江苏大学科技园;电气火灾系统&a…

【数据结构】Map和Set

目录 一、JDK中的Map和Set 1.1Map接口的使用 (1)元素的添加操作 (2)在Map集合中查询特定的值 (3)删除Map中指定的value和key (4)Map集合的遍历 1.2Set集合的应用 集合java.u…

RK3588平台开发系列讲解(Thermal篇)Thermal的设备树配置

平台内核版本安卓版本RK3588Linux 5.10Android12🚀返回专栏总目录 文章目录 一、Tsadc 配置二、cooling device配置2.1、CPU配置2.2、 GPU配置三、 Thermal Zone配置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍Thermal的设备树配置方法。 一、Tsadc 配…

【GD32F427开发板试用】+demo的正确打开方式(一)

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:四季的温度 这个系列用于汇总我在使用GD32时遇到的问题,为大家排坑 MDK环境准备 打开https://aijishu.com/a/1060000000356925&a…

搜索与图论-树与图的深度优先遍历

文章目录一、树与图的深度优先遍历1. 构造2. 遍历3. 具体实现详见例题——树的重心二、树与图的深度优先遍历例题——树的重心具体实现1. 样例演示2. 实现思路3. 代码注解4. 实现代码DFS 深度优先遍历详见搜索与图论-DFS 一、树与图的深度优先遍历 数与图的深度优先遍历与 DF…

JDK8新特性超详细总结

JDK8新特性 ​ Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选开发平台 课程内容的介绍 了解Java发展史Lambda表达式…

DNS轮询是什么

参考文章:DNS轮询是什么? DNS轮询简单来说就是一个域名解析多个IP地址。那么为什么会有DNS轮询呢?一般DNS轮询用于访问量较大的网站,由于一台服务器无法承载,所以准备了多台服务器组成集群做负载均衡,这些服…