Redis分布式锁学习

一、单体应用,使用JUC包中提供的锁

问题:单一应用无法应对高并发场景。如果对服务进行横向扩展,即增加应用节点,然后nginx配置负载均衡的方式,那么单个进程里的锁无法对其他进程中的线程生效。
解决方案:基于redis的setnx命令的原子性,使用redis缓存中间件来实现分布式锁,使用一个try/catch包裹业务代码,在finally中释放锁

二、多节点应用,使用setnx实现分布式加锁

问题:没有设置超时时间,如果加锁的线程的应用宕机则会出现死锁
解决方案:给锁添加一个超时时间,如果使用setnx和expire命令来完成加锁,则可能出现setnx完成之后就宕机依然会死锁,因此需要使用一个原子性的命令如 setex,来完成加锁

三、有过期时间的分布式锁

问题:假设A线程先获取锁,设置超时时间10秒钟,然后A线程因为一些原因导致10秒都没完成业务操作,锁过期被释放并被线程B获取到了锁,然后A线程完成业务操作去释放锁,此时释放的是线程B的锁,而后续另外的线程就开始获取锁,但锁会被线程B释放,如此往复,锁就近乎完全失效
解决方案:将redis中的value设置每个线程随机生成的唯一ID,在finally中释放锁时,每个线程需要先对redis缓存中的value进行判断,只有相同才能释放。

四、有过期时间和唯一value的分布式锁

问题:假设A线程先获取锁,设置超时时间10秒钟,然后A线程在完成对value的判断 将要去执行del命令释放锁时,但因为前面的步骤执行过久,导致刚完成判断后redis中的锁就过期了,而另外一个节点的线程B已经完成了加锁,此时线程A释放的是线程B的锁
解决方案:使用一个异步线程给锁进行续期

五、有过期时间和唯一value且可续命的分布式锁

问题:高并发场景下,为了保证redis的高可用,最起码需要一个redis的主从架构,因为主从同步的延迟,可能出现从节点还没完同步,主节点就宕机了,此时应用需要在原来的从节点上获取锁,那么之前主节点加的锁就失效了,又出现了并发问题
解决方案:redlock,部署三个或三个以上的redis主从节点集群,每次加锁时应用分别向每个主节点加锁,每个节点加锁完成后返回确认信息给应用,应用收到超过半数的确认消息,则表示完成加锁,否则加锁失败。

注:redlock并不能完美的解决redis一致性带来的并发问题,列如三个redis主节点A、B、C,一个线程先获取锁,A和B上的锁获取成功、C上的锁获取失败,此时B的主节点宕机,从节点转为主节点但是没有同步到加锁信息,此时另一个线程来获取锁,A上的锁无法获取,但是B和C都获取成功,则又出现了并发问题。可以加更多的节点来解决数据一致性的问题,但是这样会影响性能而且需要维护更多的redis。

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

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

相关文章

基于LM Studio + LLaMA3 建立本地化的ChatGPT

4月19日,Facebook母公司Meta重磅推出了Llama3。即便大家现在对于大厂和巨头频繁迭代AI模型的行为已经见怪不怪,Meta的Llama3仍旧显得与众不同,因为这是迄今最强大的开源AI模型。LLaMA模型通常采用了类似于GPT(由OpenAI开发&#x…

【Qt】error LNK2001: 无法解析的外部符号

参考:Qt/VS LNK2019/LNK2001:无法解析的外部符号_qt lnk2001无法解析的外部符号-CSDN博客 微软官方报错文档-链接器工具错误 LNK2019 __declspec error LNK2001: 无法解析的外部符号 "__declspec(dllimport) 原因 以这种为前缀的基本上跟库相关…

pnpm install报错 Value of “this“ must be of type URLSearchParams

执行pnpm install的时候就报错Value of “this” must be of type URLSearchParams 由于之前执行没有出现过这个问题,最近在使用vue3所以使用了高版本的node,怀疑是node版本的问题。 解决: 检查node版本 node -v当前使用的是20.11.0的 修改…

(delphi11最新学习资料) Object Pascal 学习笔记---第10章第3节(事件驱动编程)

10.3 事件驱动编程 ​ 在基于组件的程序库中(在许多其他情况下也是如此),您编写的代码不仅仅是一连串平顺的动作序列,而主要是反应的集合。这意味着你应该定义应用程序在发生某些事情时做出“反应”。这里“某些事情”可以是用户…

《ESP8266通信指南》7-Arduino 开发8266的环境配置与示例代码烧录

往期 《ESP8266通信指南》6-创建TCP服务器(AT指令)-CSDN博客 《ESP8266通信指南》5-TCP通信透传模式(AT指令)-CSDN博客 《ESP8266通信指南》4-以Client进行TCP通信(AT指令)-CSDN博客 《ESP8266通信指南》3-常用AT指令详解-826…

junit组件的使用

JUnit 是一个广泛使用的 Java 单元测试框架,它帮助开发者编写可重复运行的测试用例来验证代码的正确性。下面是使用 JUnit 进行单元测试的基本步骤和一些关键概念: 安装与配置 依赖管理:如果你使用的是 Maven 或 Gradle 等构建工具&#xff…

OneFlow概念清单

OneFlow概念清单 摘要: OneFlow是一个开源的深度学习框架,旨在为科研人员和开发者提供一个易于使用、高效且灵活的平台。本文将详细介绍OneFlow的核心概念,包括其架构、特性以及在深度学习领域的应用。通过阅读本文,读者将能够全…

elasticsearch 常用语法汇总

文章目录 前言elasticsearch 常用语法汇总1. 创建索引2. 检索索引信息3. 删除索引4. 文档操作4.1. 对blog_new索引指定文档ID新增4.2. 对blog_new索引不指定文档ID新增,随机文档ID:4.3. 获取文档4.4. 更新文档4.5. 删除文档 5. 查询5.1. 匹配查询5.2. 范围查询5.3. …

HackMyVM-Vulny

目录 信息收集 arp nmap nikto WEB信息收集 主页信息收集 gobuster RCE漏洞 反弹shell 提权 系统信息收集 横向渗透 flock提权 信息收集 arp ┌──(root㉿0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC…

从NuGet获取OpenTK

OpenTK是一个开源、跨平台的游戏开发库,由MonoGame团队创建。它为C#开发者提供了一个简单易用的接口,以便使用OpenGL、OpenAL和OpenCL进行3D渲染、音频处理和并行计算。OpenTK的目标是提供一个一致且高效的框架,让开发者能够专注于构建他们的…

鸿蒙(HarmonyOS)性能优化实战-Trace使用教程

概述 OpenHarmony的DFX子系统提供了为应用框架以及系统底座核心模块的性能打点能力,每一处打点即是一个Trace,其上附带了记录执行时间、运行时格式化数据、进程或线程信息等。开发者可以使用SmartPerf-Host调试工具对Trace进行解析,在其绘制…

arcgis js 4.x加载SceneLayer并实现基于属性查询定位及高亮

一、代码 <!DOCTYPE html> <html> <head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1,maximum-scale1,user-scalableno"><title></title><link rel…

python批量删除文件

python批量删除文件 1、查询与删除2、添加模块到地址中3、批量删除多个路径中不需要导出的文件 1、查询与删除 mport osdef get_files_in_folder(folder_path):files []for file in os.listdir(folder_path):if os.path.isfile(os.path.join(folder_path, file)):files.appen…

微信小程序:5.数据绑定

在Data中定义数据早wxml中进行数据使用 在data中定义数据 在页面对应的js对象中找到data&#xff0c;然后把数据进行定义即可 Page({data: {motto: Hello World,userInfo: {avatarUrl: defaultAvatarUrl,nickName: ,},hasUserInfo: false,canIUseGetUserProfile: wx.canIUse…

关于OSPF报文学习

目录 一.OSPF学习补充 &#xff08;1&#xff09;OSPF报文头部 &#xff08;2&#xff09;ospf建立邻居关系 1.Hello报文——建立邻居关系 2.hello报文头部 &#xff08;3&#xff09;OSPF建立邻接关系 1.发送DD报文 2.DD报文头部 &#xff08;4&#xff09;关于DR,BD…

力扣经典150题第四十三题:两数之和

目录 力扣经典150题第四十三题&#xff1a;两数之和题目描述示例解题思路完整代码复杂度分析总结与结语感谢您阅读本文&#xff0c;希望本文能帮助您更好地理解和掌握解决这道经典的算法问题&#xff01; 力扣经典150题第四十三题&#xff1a;两数之和 题目描述 给定一个整数…

pyqt QSplitter控件

pyqt QSplitter控件 QSplitter控件效果代码 QSplitter控件 PyQt中的QSplitter控件是一个强大的布局管理器&#xff0c;它允许用户通过拖动边界来动态调整子控件的大小。这个控件对于创建灵活的、用户可定制的用户界面非常有用。 QSplitter控件可以水平或垂直地分割其包含的子…

Bytebase 2.16.0 - 支持 Oracle 和 SQL Server DML 变更的事前备份

&#x1f680; 新功能 支持 Oracle 和 SQL Server DML 变更的事前备份。 支持在 SQL 编辑器中显示存储过程和函数。 支持兼容 TDSQL 的 MySQL 和 PostgreSQL 版本。 支持把数据库密码存储在 AWS Secrets Manager 和 GCP Secret Manager。 支持通过 IAM 连接到 Google Clou…

目标检测与追踪AI算法模型及边缘计算智能分析网关V4的算法应用

目标检测与追踪是计算机视觉领域中的一个重要任务&#xff0c;主要用于识别图像或视频中的目标&#xff0c;并跟踪它们的运动轨迹。针对这一任务&#xff0c;有许多先进的AI算法模型&#xff0c;例如&#xff1a; YOLO&#xff08;You Only Look Once&#xff09;&#xff1a;…