redis--分布式锁(1)

news2024/9/25 3:26:31

分布式锁的基本需求

  1. 互斥性:在任何时刻,只有一个客户端能持有锁。
  2. 无死锁:即使一个客户端在持有锁的期间崩溃,其他客户端也能获得锁。
  3. 容错性:分布式锁的实现应该能够容忍部分组件的失败,例如,锁服务节点的崩溃不应该影响客户端对锁的获取。
  4. 可重入性:同一个客户端可以多次获取同一把锁。

前言

为什么要使用分布式锁?

        本地锁只能锁住单台机器多线程请求的资源

        分布式锁是多台机器共同访问redis中的一个数据,只有获取到锁的线程才能访问

  注意:    

          在更新MySQL和Redis之前,先获取一个分布式锁。这样,只有获取到锁的线程才能执行更新操作,从而避免了并发更新导致的数据不一致问题。

        但是这种方法可能会导致性能下降和死锁的风险。因此,在使用分布式锁时需要谨慎考虑

如何设置分布式锁?

图解

注意:

        SETNX(SET if Not eXists):这是Redis中实现锁机制的一个基本命令。SETNX命令会尝试将指定的键(key)设置为给定的值(value),如果键不存在的话。如果键已存在,则操作无效。这可以用于尝试获取锁的场景

        返回值:1(不存在,设置成功)0(存在,设置不成功

图表的解释

  1. 代码结束要释放锁
  2. 使用try-finally语句:在程序中,使用try-finally语句块来确保无论程序是否发生异常,finally块中的代码都会被执行。这样,你可以在finally块中添加释放锁的代码,以确保在程序中断时锁能够被正确释放。但是,这种方法无法解决服务器宕机或网络中断等极端情况。
  3. 设置锁的超时时间:为锁设置一个合理的超时时间,即使程序突然中断,锁也会在超时后自动释放。这可以通过Redis的EXPIRE命令或SET命令结合EX选项来实现。这样可以避免因为程序中断而导致的死锁问题。

如果锁设置的过期时间到了,但是程序还没有执行完,这种情况怎么解决?

解决方案:

 1.增加锁的超时时间:如果任务确实需要较长时间来完成,并且你可以接受更长的等待时间,那么你可以考虑增加锁的超时时间。但请注意,过长的超时时间可能会增加死锁的风险,因为如果一个进程持有锁并因为某种原因崩溃或进入长时间阻塞状态,那么其他等待该锁的进程可能会被阻塞很长时间。

 2.锁续命(Lock Renewal):如果锁支持续命操作(如Redisson中的看门狗机制),你可以尝试在锁到期之前重新设置或延长其超时时间。这通常通过一个定时任务或后台线程来实现,定期检查锁的状态并在需要时续命。但请注意,这需要在锁被释放之前完成,否则可能会导致竞争条件。

        下面引入一张图解更好的理解看门狗机制

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

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

相关文章

Open Interpreter - 开放解释器

文章目录 一、关于演示它是如何工作的?与 ChatGPT 的代码解释器比较 二、快速开始三、更多操作1、互动聊天2、程序化聊天3、开始新的聊天4、保存和恢复聊天5、自定义系统消息6、更改模型7、在本地运行 Open Interpreter终端Python上下文窗口,最大令牌 8、…

JavaScript异步编程的Promise

目录 1.对Promise的了解 (1)介绍 (2)Promise 的优缺点 2.Promise的基本用法 (1)创建Promise对象 (2)Promise方法then() (3)Promise方法catch() &…

力扣SQL50 删除重复的电子邮箱 自连接删除 连表删除

Problem: 196. 删除重复的电子邮箱 👨‍🏫 参考题解 Code DELETE p1 FROM Person p1,Person p2 WHEREp1.Email p2.Email AND p1.Id > p2.Id

前端Web-JavaScript(下)

主要是补全一下JavaScript 基本对象: String对象 语法格式 方式1: var 变量名 new String("…") ; //方式一 例如: var str new String("Hello String"); 方式2: var 变量名 … ; //方式二 例如: var …

CHCSA第二次作业

#01、创建以上目录和文件结构,并将/yasuo目录拷贝4份到/目录下 [rootlocalhost ~]# ls /yasuo // 先检查是否有yasuo目录 ls: 无法访问 /yasuo: 没有那个文件或目录 [rootlocalhost ~]# mkdir -p /yasuo/dir1 // 递归创建目录 [rootlocalhost ~]#…

Pandas的30个高频函数使用介绍

Pandas是Python中用于数据分析的一个强大的库,它提供了许多功能丰富的函数。本文介绍其中高频使用的30个函数。 read_csv(): 从CSV文件中读取数据并创建DataFrame对象。 import pandas as pd df pd.read_csv(data.csv) read_excel(): 从Excel文件中读取数据…

嗖嗖移动业务大厅(JDBC)

一、项目介绍 1、项目背景: 该项目旨在模拟真实的移动业务大厅,。用户可以注册新卡、查询账单、管理套餐、充值话费、打印消费记录等功能。同时,项目还模拟了用户使用场景,如通话、上网、发短信等,并根据套餐规则进行相应的扣费…

AutoCAD ObjectArx二次开发(二) 关于程序入口的介绍

在上一章节中,我们介绍了环境搭建和程序插件的加载,基本的编程模板(框架)已经准备就绪。接下来,我们将开始编写自己的业务逻辑。ARX开发的核心在于将自定义函数注册到库中,并通过指定的调用命令来实现功能。…

【论文解读|Data Intelligence】 Large Knowledge Model: Perspectives and Challenges

论文链接:Large Knowledge Model: Perspectives and Challenges (sciengine.com) 来源: Data Intelligence 论文介绍: 文章简述了人类语言和世界知识的紧密关系,对比了语言模型和知识图谱在表示和处理人类知识方面的优缺点&…

Candance Allegro 入门教程笔记:PCB封装库的组成元素

文章目录 一、PCB封装库的组成元素二、使用Padstack Edictor制作封装焊盘引脚三、PCB Editor软件创建贴片封装(STM32F103T8U6 QFN36 为例)1.引入库2.读入数据 一、PCB封装库的组成元素 一般来说,针对于Allegro软件,完整的封装是由…

blender里的辉光

cycle的辉光, 点开支持后期效果 eevee的辉光,直接点bloom就行。 eevee的透明

GORM更新操作(Save、Update、Updates)

在 Go 语言的 Web 开发中,GORM 是一个广泛使用的 ORM (Object-Relational Mapping) 框架。它提供了一种流畅的方式来处理数据库的交互,其中包括记录的更新操作。GORM中的更新操作主要是update、updates、save这几种 操作前的准备工作:声明模…

C语言进阶版第五课—函数递归

文章目录 1. 什么是函数递归2. 函数递归的思想3. 函数递归的限制4. 函数递归练习4.1 n的阶乘4.2 按照顺序打印一个整数的每一位4.3 自定义函数不允许创建变量,求字符串长度 1. 什么是函数递归 函数递归就是函数自己调用自己 图片中的函数test(&#xff0…

Monaco 使用 TypeDefinitionProvider

Monaco 中的 TypeDefinitionProvider 和 ImplementationProvider、DefinitionProvider 类似,右键点击变量名称,现在 “选择转到类型定义”, 跳到指定位置。 通过 registerTypeDefinitionProvider 添加 TypeDefinitionProvider 处理方法 实现…

力扣SQL50 按日期分组销售产品 group_concact

Problem: 1484. 按日期分组销售产品 👨‍🏫 参考题解 select sell_date, count(distinct product) num_sold,group_concat(distinct product order by productseparator ,) products from activities group by sell_date

度量与增长——OrionX AI算力管理工具的企业价值解读

从科学计算到人工智能,从AI模型开发到AI模型训练,从双精度到半精度,从OPENGL到CUDA,GPU都扮演着关键角色。本文主要从运维的人员的角度出发,来探讨GPU使用过程中遇到的管理问题和创新性解决办法。 GPU的管理和监控 相…

《电容-排容》

节省电路板空间:将多个电容集成在一个封装里,减小了占用的电路板面积。 便于安装和布线:提高生产效率和电路布局的便利性。 一致性较好:由于是同一批次生产,各电容的性能参数较为一致。 【参数】品牌,封…

网络云相册实现--nodejs后端+vue3前端

目录 主页面 功能简介 系统简介 api 数据库表结构 代码目录 运行命令 主要代码 server apis.js encry.js mysql.js upload.js client3 index.js 完整代码 主页面 功能简介 多用户系统,用户可以在系统中注册、登录及管理自己的账号、相册及照片。 每…

Maven实战(四)- 生命周期和插件

Maven实战(四)- 生命周期和插件 文章目录 Maven实战(四)- 生命周期和插件1.何为生命周期2.生命周期2.1.Clean生命周期2.1.Default生命周期2.3.Site生命周期 3.Maven插件3.1.插件目标3.2.插件绑定3.2.1.内置插件3.2.2.自定义插件 4…

算法学习day28

一、寻找右区间(二分法) 题意:题目很容易理解 但是转换为二分法有点晦涩 给你一个区间数组 intervals ,其中 intervals[i] [starti, endi] ,且每个 starti 都 不同 。区间 i 的 右侧区间 可以记作区间 j ,并满足 startj > e…