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

news2024/11/15 10:28:13

🌈🌈🌈🌈🌈🌈🌈🌈
欢迎关注公众号(通过文章导读关注:【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 个线程获取分布式锁,并发度提高了 十倍

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

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

在这里插入图片描述

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

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

相关文章

计算机体系结构----存储系统

本文严禁转载,仅供学习使用。参考资料来自中国科学院大学计算机体系结构课程PPT以及《Digital Design and Computer Architecture》、《超标量处理器设计》、同济大学张晨曦教授资料。如有侵权,联系本人修改。 1.1 引言 1.1.1虚拟和物理内存 程序员看到…

ORA-12541:TNS:无监听程序

1.重新配置监听 找到监听程序配置,右键已管理员身份运行 选择第二个:重新配置 这个一般没什么好选的 默认选定的协议TCP,继续下一步 默认的否 继续下一步,完成监听重新配置 之后进行测试看能否连上 2.本地Net服务名配置 …

2024年前端最新面试题-vue3(持续更新中)

文章目录 前言正文什么是 MVVC什么是 MVVM什么是 SPA什么是SFC为什么 data 选项是一个函数Vue 组件通讯(传值)有哪些方式Vue 的生命周期方法有哪些如何理解 Vue 的单项数据流如何理解 Vue 的双向数据绑定Vue3的响应式原理是什么介绍一下 Vue 的虚拟 DOM介…

基于springboot生鲜交易系统源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包括软件架构模式、整体功能模块、数据库设计。本项…

opencv-4.8.0编译及使用

1 编译 opencv的编译总体来说比较简单,但必须记住一点:opencv的版本必须和opencv_contrib的版本保持一致。例如opencv使用4.8.0,opencv_contrib也必须使用4.8.0。 进入opencv和opencv_contrib的github页面后,默认看到的是git分支&…

【LabVIEW FPGA入门】没有CompactRIO时进行编程测试

1.新建一个空白项目。 2.新建cRIO终端。 要添加仿真的远程实时目标,请选择项目名称,右击并选择新建>>目标和设备(Targets and Devices)。 3.新建终端和设备,选一个cRIO型号 接下来,当添加目标和设备窗口出现时,请…

关于React你必须知道的3个错误用法。

1. 你知道如何使用“&&”吗? 在React程序中,我经常使用“&&”运算符来决定是否显示内容,如下所示: 我的组长: “你不知道&&运算符的特性吗?当请求还没有成功返回时,会直接渲染“0”。” 我并不信服, 因为我一直都是这样编写代码,从未出过错。为了…

uniapp怎么开发插件并发布

今天耳机坏了,暂时内卷不了,所以想开发几个插件玩玩,也好久没写博客了,就拿这个来写了 首先,发布插件时需要你有项目 这里先拿uniapp创建一个项目, 如下,创建好的项目长这样 然后根据uniapp官网上说的,我们发布插件时,需要在uni_modules里面编写和发布 ps:还需要使用uniapp…

OpenWrt智能路由器Wan PPPoE拨号配置方法

OpenWrt智能路由器的wan PPPoE拨号配置方法和我们常见的不太一样, 需要先找到wan网卡,然后将协议切换为 PPPoE然后才能看到输入上网账号和密码的地方. 首先登录路由器 http://openwrt.lan/ 然后找到 Network --> Interfaces 这里会显示你当前的路由器的所有接口, 选择 …

代码随想录算法训练营第七天|哈希表理论基础,454.四数相加II ,383. 赎金信 ,15. 三数之和 ,18. 四数之和

刷题建议 刷题建议与debug 代码随想录目前基本都有了视频讲解,一定要先看视频,事半功倍。写博客,将自己的感悟沉淀下来,不然会忘大家提问的时候,记得要把问题描述清楚,自己在哪一步遇到了问题&#xff0c…

(学习日记)2024.01.09

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

5V高细分步进电机驱动芯片选型分析

单通道5V高细分步进电机GC6139 GC6106 GC6107 GC6119 GC6151 GC6236 GC8558 它们应用在摇头机,X,Y控制,聚焦控制等产品上。其中GC8558为24V H 桥驱动,大电流,具有短地短电源保护,限流保护等功能。

qt学习:多界面跳转+信号+槽函数

目录 概念 分类 多界面编程思路 新建界面 注意 头文件 无数据传输跳转界面 有数据传输跳转界面 对象公有接口 界面之间数据传输 信号与槽函数进行数据传输跳转界面 信号: 槽: 概念 格式1 关联信号和发送信号 格式2 通信步骤 自定义信号和槽函数 总结 实…

C++/WinRT 入门

本主题将会根据新的 Windows 控制台应用程序 (C/WinRT) 项目演练一个简单的代码示例。 C/WinRT 快速入门 创建一个新的 Windows 控制台应用程序(C/WinRT) 项目。 根据实际选择平台 如果出现如下错误,需要安装正确的SDK。 找不到 Windows SDK 版本 10.0.17134.0 (o…

Seata TM管理分支事务源码

TM相当于一个中间商,是没有涉及到任何数据库底层操作的。 TransactionalTemplate 1、TM向TC端发起一次开启全局事务的请求 io.seata.tm.api.TransactionalTemplate#beginTransaction --> io.seata.tm.api.DefaultGlobalTransaction#begin(int, java.lang.Strin…

scroll-view在小程序页面里实现滚动,uniapp项目

要实现红框中的区域进行滚动,scroll-view必须写高 <template><!-- 合同-待确认 --><view class"viewport"><!-- 上 --><view class"top-box"><!-- tab --><view class"tabs"><textv-for"(ite…

回归预测 | Matlab实现SSA-CNN-LSTM-Attention麻雀优化卷积长短期记忆神经网络注意力机制多变量回归预测(SE注意力机制)

回归预测 | Matlab实现SSA-CNN-LSTM-Attention麻雀优化卷积长短期记忆神经网络注意力机制多变量回归预测&#xff08;SE注意力机制&#xff09; 目录 回归预测 | Matlab实现SSA-CNN-LSTM-Attention麻雀优化卷积长短期记忆神经网络注意力机制多变量回归预测&#xff08;SE注意力…

Fabric2.2:在有系统通道的情况下搭建应用通道

写在最前 在使用Fabric-SDK-Go1.0.0操作Fabric网络时遇到了bug。Fabric-SDK-GO的当前版本没有办法在没有系统通道的情况下创建应用通道&#xff0c;而Fabric的最新几个版本允许在没有系统通道的情况下搭建应用通道。为了解决这个矛盾并使用Fabric-SDK-GO完成后续的项目开发&…

Hive命令行运行SQL将数据保存到本地如何去除日志信息

1.场景分析 先有需求需要查询hive数仓数据并将结果保存到本地&#xff0c;但是在操作过程中总会有日志信息和表头信息一起保存到本地&#xff0c;不符合业务需要&#xff0c;那如何才能解决该问题呢&#xff1f; 废话不多少&#xff0c;直接上代码介绍&#xff1a; 2.问题解决…

HarmonyOS应用开发学习笔记 arkTS自定义弹窗(CustomDialog)简单使用 arkTS弹出框回调、监听

HarmonyOS应用开发学习笔记 arkTS自定义弹窗&#xff08;CustomDialog&#xff09;简单使用 1、CustomDialog装饰器用于装饰自定义弹框 1、定义弹出框 CustomDialog CustomDialog export struct CustomDialogExample {controller: CustomDialogControllerbuild() {Column() {…