【面试突击】分布式锁、幂等性问题实战

🌈🌈🌈🌈🌈🌈🌈🌈
欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术 的推送
发送 资料 可领取 深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景中间件系列笔记编程高频电子书

文章导读地址:点击查看文章导读!

感谢你的关注!

🍁🍁🍁🍁🍁🍁🍁🍁

前言

最近在更新面试突击专栏,我把每一篇将字数都尽量控制在 2000 字以内,可能在文章里边写的没有那么细致,主要是提供一些 问题 以及 回答的思路 ,以及 面试中可能忽略的漏洞 ,所以在看完文章之后,如果自己简历中有这方面的内容的话,一定要认真去整理一份自己的回答,并且多查阅相关资料,如果看的文章少,就会导致学习到的内容太片面

分布式锁、幂等性问题

接下来主要说一下,分布式系统中,在业务以及技术实践中,经常遇到的一些问题

接口有处理幂等性问题吗?

什么时候需要处理 幂等性问题 呢?

就比如 创建订单 场景中,如果因为网络抖动原因,导致请求超时了,此时去重试创建订单操作,发送了 重复请求,那么就可能导致出现了重复创建订单的操作

怎么解决呢?对接口进行 幂等性处理

幂等性处理的解决方案我之前也写过一篇文章,可以参考一下:幂等性处理

具体选择哪一种方案,需要根据自己的业务需求来选

一般不需要对所有的接口都保证幂等性,而是仅仅 对少数的核心接口保证幂等性

比如对于创建类的操作,可以通过 数据库中的唯一索引 来保证幂等性

对于更新类的操作,可以通过 Redis 来保证幂等性

分布式锁问题

先说一下什么时候需要去使用 分布式锁

就比如,多个服务对同一个数据进行操作的时候,为了保证该数据的 并发安全,需要在操作前加上 分布式锁

这里举个分页缓存的例子,在 Redis 中构建一个分页缓存,那么在第一次查询时,会进行分页缓存的构建,如果分页缓存中的数据发生变化,也需要对分页缓存进行构建,如果不加分布式锁,就会出现 数据库和缓存不一致 的问题出现:

  • 当用户 A 新增分享的时候,另一个用户 B 此时正好来查询用户 A 的分享列表,用户 B 线程先去缓存中查询,发现没有,再去数据库中查询用户 A 的分享列表,此时 B 拿到了 A 新增分享之前的旧数据,此时如果用户 A 新增分享并落库,并且去缓存中对用户 A 的列表缓存进行重建,那么此时缓存列表中是用户 A 的最新数据,但是此时用户 B 的线程在数据库中已经查到了用户 A 的旧数据,用户 B 的线程继续执行,将用户 A 的旧数据给放入到列表缓存中,覆盖掉了用户 A 更新的缓存,那么此时就会导致缓存数据库不一致

这个我之前也写过一篇文章,可以查看具体操作:Redis 分页缓存+分布式锁

分布式锁常见的有:Redis 实现的分布式锁、ZooKeeper 实现的分布式锁

那么对于这两种分布式锁实现的 原理 一定要清楚,其中使用 Redis 的分布式锁一般都是用 Redisson 框架提供的,里边的分布式锁的源码,有时间的情况下,真的要好好了解一下!

其实选择分布式锁,使用 Redis 分布式锁比较多,因为 Redis 在高并发场景下的表现比 ZooKeeper 要好一些

而对于 ZooKeeper 分布式锁来说,了解它原理的同时,也要去了解一下存在的 羊群效应 以及如何对羊群效应进行优化!

我在这一篇文章中也写了,可以详细看一下:ZooKeeper 中的分布式读写锁应对羊群效应

如果 Redis 集群故障时,分布式锁会失效吗?

其实是 会失效 的,如果客户端 A 去 Redis 集群中添加分布式锁,先将锁写入到 Redis 的 master 中,如果 master 还没来得及将分布式锁同步到 slave 就宕机了,那么就会导致 slave 中并没有分布式锁的信息,如果客户端 B 来加锁,还是可以加上同一把锁,结果就是客户端 A 和 B 都拿着同一把分布式锁在执行

这种情况解决的话,解决思路是加分布式锁时,必须 master 和 slave 都同时写入分布式锁信息 之后,才算加锁成功,这样就不会出现上边的问题了

这样解决的话,就抛弃了一部分性能,来换取可靠性

不过这种问题出现的概率还是很小的,任何系统设计方案都存在利弊,舍弃一部分对自己业务不重要的可靠性来提升性能或者相反,都是根据自己业务需要来进行选择

分布式锁在高并发场景下的优化问题

如果面试一些互联网大厂,提高分布式锁这块的内容,可能面试官会去问你,有对分布式锁进行过性能优化吗?

这一块的内容,可能大家没有想过这个问题,其实思路也比较简单,就是 分段加锁,目的就是减小你的锁粒度,以此来 提高系统的并发度

就比如,扣减库存,需要添加分布式锁,如果库存有 10000 个,那么可以在数据库中创建 10 个库存字段,stock_1stock_2…,那么每次对库存操作,就对其中的一个库存字段给加锁就可以的,将库存分成了 10 个库存字段,原来一个分布式锁对库存加锁,同一时间只可以一个线程来处理,库存分片之后,同一时间可以有 10 个线程获取分布式锁,并发度提高了 十倍

如果某次来扣减库存时,库存不足的情况下,需要合并库存进行扣减,合并库存就是对其他库存字段加锁,并且查询库存,如果足够,就进行库存扣减操作

总的来说,对分布式锁的优化就是:分段锁 + 合并库存扣减

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构之树和二叉树】

数据结构学习笔记---007 数据结构之树和二叉树概念篇1、树的概念和结构1.1、树的相关概念1.2、树的存储结构 2、二叉树概念及结构2.1、二叉树概念2.2、满二叉树2.3、完全二叉树2.4、满二叉树或完全二叉树的存储形式 3、堆的概念及结构3.1、堆的性质3.2、堆的意义 4、二叉树的存…

R语言【paleobioDB】——pbdb_map():根据化石记录绘制地图

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新,该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后,执行本地安装。 Usage pbdb_map (data, col.int"white" ,p…

宝塔面板安装MySQL8数据库

第一步:搜索mysql 第二步: 点击安装 我这里选择安装8版本 第三步:给宝塔配置mysql防火墙 第四步:修改数据库密码 第五步:想要使用navicat连接 需要修改root的权限 (1)使用secureCRT先登录mysql (2) 输入u…

最最常用的MySQL Shell运维脚本,赶紧收藏吧!

作为运维人员或者开发人员,日常的mysql运维工作我们是一定要会的,我收集了一些常用shell脚本,仅供参考! 1、备份数据库: #!/bin/bashBACKUP_DIR"backup_dir" MYSQL_USER"mysql_user" MYSQL_PASS…

【DDR】基于Verilog的DDR控制器的简单实现(一)——初始化

在FPGA中,大规模数据的存储常常会用到DDR。为了方便用户使用,Xilinx提供了DDR MIG IP核,用户能够通过AXI接口进行DDR的读写访问,然而MIG内部自动实现了许多环节,不利于用户深入理解DDR的底层逻辑。 本文以美光(Micro…

解惑:测试圈网红工具 Jmeter 到底难在哪里

作为一名测试人员,你是否也曾经遇到过这些问题: 同样的起点,同样的工作时间,为什么别人接那么多项目,你还是在点点点;为什么别人升职了,而你还在原地踏步? 同样的工作内容&#xf…

C++力扣题目404--左叶子之和

给定二叉树的根节点 root ,返回所有左叶子之和。 示例 1: 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 思路 首先要注意是判断左叶子&#xff0…

Java锁的分类

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Sprin…

【MIT 6.S081】2020, 实验记录(3),Lab: page tables

目录 TaskTask 1: Print a page table Task Task 1: Print a page table 该实验需要增加一个 vmprint 函数,用于打印一个 page table,实现过程可以参考 vm.c 文件中的 freewalk() 函数。 在 defs.h 中增加 vmprint 的定义: void …

BikeDNA(七)外在分析:OSM 与参考数据的比较1

BikeDNA(七)外在分析:OSM 与参考数据的比较1 该笔记本将提供的参考自行车基础设施数据集与同一区域的 OSM 数据进行所谓的外部质量评估进行比较。 为了运行这部分分析,必须有一个参考数据集可用于比较。 该分析基于将参考数据集…

恭喜:ChatGPT之父与相恋多年的男友结婚,并希望早日生娃。。。

OpenAI CEO Sam Altman与伴侣Oliver Mulherin海边私密婚礼:爱情、事业与人工智能领域的交织 婚礼主持人是奥特曼的兄弟杰克奥尔特曼 壹.媒体流传 在科技界掀起波澜的OpenAI首席执行官萨姆奥尔特曼(Sam Altman),近期与他长久以来的…

[Flutter] extends、implements、mixin和 abstract、extension的使用介绍说明

类创建:abstract(抽象类)、extension(扩展) 1.abstract(抽象类) dart 抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。抽象类通过abstract 关键字来…

activiti流程图+动态表单

使用技术 jeecg-bootactivitivue3form-create 简单效果展示 流程图绘制 审批人配置 动态表单配置 流程审批 流程审批记录 填写表单信息 源码地址 后台:https://gitee.com/houshixin/jmg-boot前端:https://gitee.com/houshixin/jmg-ui

在Linux下配置Apache HTTP服务器

在Linux的世界里,如果说有什么比解决各种“神秘”的故障更让人头疼,那一定就是配置Apache HTTP服务器了。这不是因为Apache有什么问题,而是因为配置它简直就像解谜游戏,一不留神就会让你陷入无尽的纠结。 首先,你需要…

数据库的数据类型

文章目录 前言一、数据类型数据类型分类数值类型bit类型小数类型floatdecimal 字符串类型charvarcharchar和varchar比较 日期和时间类型enum和set 前言 一、数据类型 数据类型分类 数值类型 下面我们来创建一个表,表中创建一个tinyint类型的数据。当我们不指定tiny…

记录汇川:H5U与Factory IO测试12

主程序: 子程序: IO映射 子程序: 辅助出料 子程序: 自动程序 Factory IO配置: 实际动作如下: Factory IO测试12

2023一带一路暨金砖国家技能发展与技术创新大赛“网络安全”赛项省选拔赛样题卷②

2023金砖国家职业技能竞赛"网络安全" 赛项省赛选拔赛样题 2023金砖国家职业技能竞赛 省赛选拔赛样题第一阶段:职业素养与理论技能项目1. 职业素养项目1. 职业素养项目2. 网络安全项目3. 安全运营 第二阶段:安全运营项目1. 操作系统安全配置与加…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux网络编程第一天-socket编程(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式培训笔记,嵌入式硬件,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机领域.https://blog.csdn.net/weixin_3980490…

深入理解Lock Support

第1章:引言 大家好,我是小黑,今天咱们要聊聊Lock Support。Lock Support是Java并发编程的一块基石,它提供了一种非常底层的线程阻塞和唤醒机制,是许多高级同步工具的基础。 为什么要关注Lock Support?线程…

七通道NPN 达林顿管GC2003,专为符合标准 TTL 而制造

GC2003 内部集成了 7 个 NPN 达林顿晶体管,连接的阵列,非常适合逻辑接口电平数字电路(例 如 TTL,CMOS 或PMOS 上/NMOS)和较高的电流/电压,如电灯电磁阀,继电器,打印机或其他类似的负…