02_redis分布式锁原理
文章目录
- 一、redis如何实现分布式锁
- 1. 使用 SETNX 命令
- 2. 设置过期时间
- 3. 释放锁
- 4. 注意事项
- 5. 示例代码
- 二、Java中分布式锁如何设置超时时间
- 1. Redis分布式锁
- 2. 基于Zookeeper的分布式锁
- 3. 基于数据库的分布式锁
- 注意事项
一、redis如何实现分布式锁
Redis 实现分布式锁是一种常见且高效的方式。以下是关于 Redis 实现分布式锁的一些关键点和步骤:
1. 使用 SETNX 命令
Redis 提供了一个非常方便的命令 SETNX
(SET if Not eXists),它可以在指定的 key 不存在时,为 key 设置一个值。这个命令天然地适合用作分布式锁的占位符。
- 命令格式:
SETNX key value
- 返回值:如果 key 不存在,设置 key 的值为 value,返回 1。如果 key 已存在,不做任何操作,返回 0。
2. 设置过期时间
为了防止由于异常情况导致锁无法释放,我们通常需要给锁设置一个过期时间。这可以通过 EXPIRE
命令来实现,或者更优雅地使用 SET
命令的扩展参数。
- 命令格式:
EXPIRE key seconds
或SET key value EX seconds
(后者同时设置值和过期时间)
3. 释放锁
释放锁的操作相对简单,只需要删除对应的 key 即可。但是,这里需要注意一个细节:只有当锁的持有者(即设置锁的进程)才能释放锁。因此,在删除锁之前,我们需要检查锁的值是否匹配。
- 命令格式:
DEL key
或LUA 脚本
(为了确保原子性,通常使用 LUA 脚本来检查并删除锁)
4. 注意事项
- 时钟漂移:在分布式系统中,不同机器的时钟可能存在漂移。因此,设置过期时间时需要考虑这一点,避免由于时钟漂移导致的锁提前释放或过期未释放。
- 可重入性:如果同一个进程需要多次获取同一个锁,那么锁应该是可重入的。Redis 本身不支持可重入锁,但可以通过在应用层实现一个计数器来解决这个问题。
- 锁续期:为了避免锁因为操作时间过长而过期,可以在持有锁期间定期续期。这同样需要通过 LUA 脚本来确保原子性。
- 死锁检测:虽然 Redis 分布式锁本身不会直接导致死锁(因为有过期时间),但应用层仍然需要处理可能出现的死锁情况。例如,可以设置一个监控线程来检测长时间未释放的锁,并进行相应的处理。
5. 示例代码
以下是一个简单的使用 Redis 实现分布式锁的 Java 示例代码(基于 Jedis 库):
import redis.clients.jedis.Jedis;public class RedisDistributedLock {private Jedis jedis;private String lockKey;private String lockValue;private int expireTime;public RedisDistributedLock(Jedis jedis, String lockKey, String lockValue, int expireTime) {this.jedis = jedis;this.lockKey = lockKey;this.lockValue = lockValue;this.expireTime = expireTime;}public boolean tryLock() {String result = jedis.set(lockKey, lockValue, "NX", "EX", expireTime);return "OK".equals(result);}public void unlock() {String script = "if redis.call('get', KEYS[1]) == ARGV[1] then " +"return redis.call('del', KEYS[1]) " +"else " +"return 0 " +"end";jedis.eval(script, 1, lockKey, lockValue);}
}
在这个示例中,tryLock
方法尝试获取锁,如果成功则返回 true
,否则返回 false
。unlock
方法使用 LUA 脚本来确保只有锁的持有者才能释放锁。
二、Java中分布式锁如何设置超时时间
在Java中实现分布式锁时,设置超时时间是非常重要的,因为它可以防止锁被永远持有(例如,由于客户端崩溃或网络问题导致的锁无法释放)。不同的分布式锁实现方式可能有不同的方法来设置超时时间。以下是一些常见的分布式锁实现及其超时时间设置方法:
1. Redis分布式锁
当使用Redis实现分布式锁时,通常会使用SET
命令结合NX
(仅当键不存在时设置)和PX
(设置键的过期时间,以毫秒为单位)选项来确保原子性和超时控制。
String lockKey = "myLock";
String lockValue = UUID.randomUUID().toString(); // 使用唯一值作为锁的值,以便后续释放锁时验证
int lockExpireTime = 5000; // 锁的超时时间,单位为毫秒Jedis jedis = new Jedis("localhost");
try {String result = jedis.set(lockKey, lockValue, "NX", "PX", lockExpireTime);if ("OK".equals(result)) {// 成功获取锁,执行临界区代码} else {// 获取锁失败,可能已经被其他客户端持有}
} finally {jedis.close();
}
在这个例子中,PX 5000
设置了锁的超时时间为5000毫秒(5秒)。
2. 基于Zookeeper的分布式锁
Zookeeper也常用于实现分布式锁。在使用Zookeeper时,可以通过创建临时有序节点来实现锁的功能,并设置节点的超时时间(即会话超时)。
CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181", new ExponentialBackoffRetry(1000, 3));
client.start();
try {InterProcessMutex lock = new InterProcessMutex(client, "/my_lock");try {if (lock.acquire(5, TimeUnit.SECONDS)) { // 设置超时时间为5秒try {// 成功获取锁,执行临界区代码} finally {lock.release();}} else {// 获取锁失败}} catch (Exception e) {// 处理异常}
} finally {client.close();
}
在这个例子中,lock.acquire(5, TimeUnit.SECONDS)
设置了尝试获取锁的超时时间为5秒。
3. 基于数据库的分布式锁
虽然不太常见,但也可以使用数据库来实现分布式锁。通常,这涉及到在数据库中创建一个锁表,并通过SQL语句来检查、设置和释放锁。超时时间可以通过在数据库中设置锁的过期时间来实现。
注意事项
- 超时时间的设置:超时时间应该足够长,以确保在正常情况下能够完成任务,但也不能太长,以避免锁被长时间持有而浪费资源。
- 锁的释放:在释放锁时,需要确保只有持有锁的客户端才能释放锁(例如,通过比较锁的值)。
- 异常处理:在获取锁和释放锁的过程中,需要妥善处理异常,以避免由于异常导致锁无法被正确释放。
- 分布式环境的复杂性:在分布式环境中,由于网络延迟、节点故障等原因,实现可靠的分布式锁可能比较复杂。因此,在选择分布式锁实现时,需要仔细考虑其可靠性和性能。
相关文章:
02_redis分布式锁原理
文章目录 一、redis如何实现分布式锁1. 使用 SETNX 命令2. 设置过期时间3. 释放锁4. 注意事项5. 示例代码 二、Java中分布式锁如何设置超时时间1. Redis分布式锁2. 基于Zookeeper的分布式锁3. 基于数据库的分布式锁注意事项 一、redis如何实现分布式锁 Redis 实现分布式锁是一…...
07SpringMVC底层形象解析
目录 一、基于餐厅比喻的代码示例 ,帮助你理解各组件间的协作关系 1. DispatcherServlet 配置(服务员) 2. HandlerMapping 配置(菜单索引) 3. Controller 实现(厨师) 4. Service 层&#x…...
jvm调优以及常见jvm问题解决等
1、通过top命令查询异常的进程 top 2、通过 使用top -Hp<PID>命令查看该进程内各个线程的CPU占用情况: top -Hp PID 记录下占用CPU较高的线程ID。 3、转换线程ID为十六进制 使用printf命令将线程ID 19664 转换为十六进制,结果为 0x4cd0࿱…...
深入理解万维网:URL、HTTP与HTML
深入理解万维网:URL、HTTP与HTML 统一资源定位符(URL) 1.1 什么是URL? 统一资源定位符URL(Uniform Resource Locator)是万维网上用于标识和定位各种文档的标准方法,它使每个资源在互联网范围内…...
RPC 协议详解、案例分析与应用场景
一、RPC 协议原理详解 RPC 协议的核心目标是让开发者像调用本地函数一样调用远程服务,其实现过程涉及多个关键组件与流程。 (一)核心组件 客户端(Client):发起远程过程调用的一方,它并不关心调…...
唯创安全优化纸业车间安全环境:门口盲区预警报警器的应用与成效
一、客户现场 客户主要从事于卷烟纸、成型纸、烟草制造业用纸及其他特定用途纸类制品的加工、生产与销售。在其厂区内,叉车频繁作业,车间环境复杂。经实地查看,发现几大安全隐患: 门口拐角隐患:门口拐角处因卷帘门阻…...
解决dedecms织梦系统{dede:arclist keyword=‘动态获取关键词‘}只生效一次
当我们通过{dede:arclist keyword关键词}来调用文章列表时,你会发现只在其中一个栏目里生效,在其他栏目,仍然显示上一次的关键词。 原因是由于arclist的缓存导致的。 只需修改/include/taglib/arclist.lib.php文件,大概在384行&a…...
高级学习算法(神经网络 决策树)
目录 神经网络 (Neural networks)神经网络的介绍需求预测 (Demand Prediction)例子:图像识别人脸识别(Face recognition)汽车分类(Car classification) 神经网络中的层更复杂的神经网络推理:前向传播 (Forw…...
labview硬件部分——温度测量
硬件连接: (1)温度测量的电压采集:(电压的单位为V) 温度采集程序图: 运行结果: 我们可以在显示控件中,看到温度采集的电压值 (2)温度采集的电压…...
labview——控制继电器模块
高电平——5V 超过一定的电压值,LED打开、继电器打开。(结合模拟电压采集与LED控制) 控制继电器是数字信号控制。程序与LED控制一致。 (1)我们先来看看继电器的控制 使用布尔按键,按键按下时࿰…...
ArcGIS Pro 3.4 二次开发 - 核心主机
环境:ArcGIS Pro SDK 3.4 .NET 8 文章目录 核心主机1 核心主机1.1 初始化核心主机 核心主机 1 核心主机 1.1 初始化核心主机 using ArcGIS.Core.Data; //必须引用 ArcGIS.CoreHost.dll using ArcGIS.Core.Hosting; class Program { //应用程序入口点必须包含 [S…...
IntelliJ IDEA 接入 DeepSeek帮助你更好编码
适配 IDEA 版本为了更好的使用插件,这里推荐使用一个代理插件——CodeGPT,CodeGPT是一个AI驱动的代码助手,旨在帮助开发者进行各种编程活动,它是GitHub Copilot、AI Assistant、Codiumate和其他JetBrains插件的强大替代品。安装之…...
如何使用Java生成pdf报告
文章目录 一、环境准备与Maven依赖说明二、核心代码解析1. 基础文档创建2. 中文字体处理3. 复杂表格创建4. 图片插入 三、完整代码示例四、最终效果 这篇主要说一下如何使用Java生成pdf,包括标题,文字,图片,表格的插入和调整等相关…...
Memory模块是agent的一个关键组件
Memory 2.6.1 简介 在Agent系统中,Memory模块是一个关键的组件,其主要功能是存储和检索信息,以支持agent的学习和决策过程。该模块模拟人类记忆的某些特征,能够动态地保存和更新信息,使agent能够利用过去的经验进行推…...
初级社会工作者考试难点总结
初级社会工作者考试难点总结 初级社会工作者(助理社会工作师)考试是进入社会工作行业的入门级资格认证,考试内容涵盖社会工作理论、实务技能及相关法规政策。虽然考试难度相对适中,但部分知识点和题型仍让考生感到棘手。本文总结…...
mapbox进阶,手写放大镜功能
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.1 ☘️mapboxgl.Map style属性二、🍀手写放大镜功能1. ☘️实现思路2. ☘️…...
EasyRTC嵌入式音视频通信SDK一对一音视频通信,打造远程办公/医疗/教育等场景解决方案
一、方案概述 数字技术发展促使在线教育、远程医疗等行业对一对一实时音视频通信需求激增。传统方式存在低延迟、高画质及多场景适配不足等问题,而EasyRTC凭借音视频处理、高效信令交互与智能网络适配技术,打造稳定低延迟通信,满足基础通信…...
微信小程序中,解决lottie动画在真机不显示的问题
api部分 export function getRainInfo() {return onlineRequest({url: /ball/recruit/getRainInfo,method: get}); }data存储json数据 data:{rainJson:{} }onLoad方法获取json数据 onLoad(options) {let that thisgetRainInfo().then((res)>{that.setData({r…...
基于Flink的数据中台管理平台
基于Flink做的数据中台工程项目。数据从source到clickhouse全流程的验证。集成元数据管、数据资产、数据发现功能,自主管理元数据变更,集成元数据版本管理。 同时,对整个大数据集群使用到的组件或者是工具进行管理。比如nacos、kafka、zookee…...
Flink-Yarn运行模式
Yarn的部署过程 Yarn上部署的过程是:客户端把Flink应用提交给Yarn的ResourceManager,Yarn的ResourceManager会向Yarn的NodeManager申请容器,在这些容器上,Flink会部署JobManager和TaskManager的实例,从而启动集群,Flin…...
Java---斐波那契那数列
一、斐波那契数列的定义与起源 1. 数学定义 斐波那契数列(Fibonacci Sequence)又称黄金分割数列,其定义为: 初始项: F(0)0F(1)1 递推公式: 当 n≥2 时,F(n)F(n−1)F(n−2) 前 10 项数列&…...
通过AIoTedge或ThingsKit物联网平台内置的Node-RED读取OPC-UA
《通过AIoTedge或ThingsKit物联网平台内置的Node-RED读取OPC-UA》 一、引言 随着工业物联网(IIoT)的快速发展,设备之间的互联互通变得至关重要。OPC-UA(Open Platform Communications Unified Architecture)作为一种…...
《大模型开源与闭源的深度博弈:科技新生态下的权衡与抉择》
开源智能体大模型的核心魅力,在于它构建起了一个全球开发者共同参与的超级协作网络。想象一下,来自世界各个角落的开发者、研究者,无论身处繁华都市还是偏远小镇,只要心怀对技术的热爱与追求,就能加入到这场技术狂欢中…...
genicamtl_lmi_gocator_objectmodel3d
目录 一、在halcon中找不到genicamtl_lmi_gocator_objectmodel3d例程二、在halcon中运行genicamtl_lmi_gocator_objectmodel3d,该如何配置三、代码分段详解(一)传感器连接四、代码分段详解(二)采集图像并显示五、代码分…...
Node.js 24发布:性能与安全双提升
在科技的迅速发展中,Node.js作为一个备受青睐的开源跨平台Java运行环境,近日迎来了其24.0版本的正式发布。此次更新不仅承诺提升性能和安全性,还为开发者提供了更为顺畅的开发体验,值得我们深入探讨。 Node.js 24.0的最大亮点之一…...
是德科技 | 单通道448G未来之路:PAM4? PAM6? PAM8?
内容来源:是德科技 随着数据中心规模的不断扩大以及AI大模型等技术的兴起,市场对高速、大容量数据传输的需求日益增长。例如,AI训练集群中GPU等设备之间的互联需要更高的传输速率来提升效率。在技术升级方面,SerDes技术的不断进步…...
Dify智能体开发实践
1.聊天助⼿:创建技术⽀持问答机器⼈,通过提示词约束回答范围并引导追问澄清。 1.提示词 (1)技术支持机器人提示词 你是一位专业的技术支持机器人,专门为公司的各类技术产品和服务提供支持。你的回答范围严格限制在以下…...
网络安全之APP渗透测试总结
1、脱壳 360免费版加固,frida-dexdump、blackdex都可以脱掉。这里就不演示了 GitHub - hluwa/frida-dexdump: A frida tool to dump dex in memory to support security engineers analyzing malware. 2、密码泄露 经过对app登录界面,有对密码强度进行…...
笔记:NAT
一、NAT 的基本概念 NAT(Network Address Translation,网络地址转换) 是一种在 IP 网络中重新映射 IP 地址的技术,主要用于解决 IPv4 地址短缺问题,同时提供一定的网络安全防护作用。 功能: 将内部网络&am…...
民锋视角下的多因子金融分析模型实践
在当前金融市场环境中,数据粒度与因子建模逐渐成为提升交易系统稳定性的重要方式。民锋长期专注于模型优化与策略深度挖掘,提出了一套适用于中短周期的数据判断体系,核心在于“多因子融合动态调权”。 具体而言,民锋的分析框架常…...
ThinkPHP 根据路由文件获取路由列表
定义一个路由变量 比如我们要获取admin的路由 $routeFile "admin.php"; 清除路由 调用 Route::clear() 方法,清除当前已定义的所有路由。 Route::clear();设置路由懒加载 调用 Route::lazy(false) 方法,禁用路由的懒加载功能,选择立即加…...
算法打卡第三天
10.长度最小的子数组 (力扣209题) 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度**。**如果不存在符合条件的子…...
04_spring容器管理单例多例
文章目录 1. 单例(Singleton)2. 多例(Prototype)3. 使用场景4. 注意事项 在Spring框架中,Spring容器负责创建、配置和管理应用程序中的bean。关于单例(Singleton)和多例(Prototype&a…...
算法C++最大公约数
原理 代码实现 #include <stdio.h>// 递归版本 int gcd_recursive(int a, int b) {if (b 0) return a; // 终止条件:余数为0时,除数即为GCDreturn gcd_recursive(b, a % b); // 递归调用,更新为(b, a%b) }// 迭代版本 int gcd_iterat…...
在 Ubuntu 下通过 C APP程序实现串口发送数据并接收返回数据
一、前言 使用 C 应用进行串口调用需要手动配置串口的各项参数,并且 Ubuntu 下的串口是通过读写文件实现的,所以还需要设置权限。 二、源码分析 serial.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <…...
ubuntu24.04+RTX5090D 显卡驱动安装
初步准备 Ubuntu默认内核太旧,用mainline工具安装新版: sudo add-apt-repository ppa:cappelikan/ppa sudo apt update && sudo apt full-upgrade sudo apt install -y mainline mainline list # 查看可用内核列表 mainline install 6.13 # 安装…...
ubuntu22.04上运行opentcs6.4版本
1、下载github上的源码: openTCS - Downloads 2、安装java21 我的版本是:java --version java 21.0.6 2025-01-21 LTS Java(TM) SE Runtime Environment (build 21.0.68-LTS-188) Java HotSpot(TM) 64-Bit Server VM (build 21.0.68-LTS-188, mixed mo…...
labelme进行关键点标注并转换为yolo格式
目录 1、labelme安装和打开2、边界框和关键点标注3、将lamelme的json格式转成yolo可以使用的txt格式4、将数据和标签按照9比1分为训练集和测试集 1、labelme安装和打开 在python3.9及以上环境中安装labelme,labelme要用到pyqt,所以在使用labelme之前要安…...
每日算法-250521
每日算法学习 大家好!这是我今天的算法练习记录,分享四道 LeetCode 题目的解题思路和代码。希望能对大家有所帮助! 219. 存在重复元素 II 题目 思路 哈希表 利用哈希表来存储数组中元素及其最近出现的索引。 解题过程 当我们遍历数组 num…...
正大模型视角下的高频交易因子构建策略研究
正大模型视角下的高频交易因子构建策略研究 在金融衍生品交易体系中,数据主导型模型逐渐成为核心竞争力。以正大为代表的量化团队,通过大量历史数据研究,构建出一套基于高频因子的模型框架,从成交节奏、盘口行为、价格波动等维度动…...
Babylon.js学习之路《八、动画基础:关键帧动画与缓动效果》
文章目录 1. 引言:动画在3D场景中的核心作用2. 关键帧动画基础2.1 键帧动画原理2.2 创建简单关键帧动画 3. 缓动函数(Easing Functions)3.1 缓动函数的作用3.2 应用缓动函数 4. 复杂动画:多属性联动与序列控制4.1 同时控制位置、旋…...
小满未满,是成长的序章
节气小满,昭示着奋斗正当时,Codigger 怀揣热忱,在代码的天地里披荆斩棘,向着圆满目标大步迈进 。...
JavaWeb 开发流程
项目建立 SpringBoot框架构建 Spring Boot 是基于 Spring 框架的开源 Java 基础框架,用于创建独立、生产级的基于 Spring Framework 的应用程序。 我们可以使用IDEA建立SpringBoot框架。 语言选择Java,类型选择Maven,JDK和Java要保持一致&…...
Cmake 使用教程
介绍 CMake 是一个开源、跨平台的构建系统,主要用于软件的构建、测试和打包。CMake 使用平台无关的配置文件 CMakeLists.txt 来控制软件的编译过程,并生成适用于不同编译器环境的项目文件。例如,它可以生成 Unix 系统的 Makefile 、 Win…...
CLIP、ViLT 与 LLaVA:多模态模型是如何看图说话的?
一、前言:我们已经讲了 MLLM 能力,但它到底是怎么实现“看图说话”的? 在之前文章中,我们已经提到了MLLM可以看图说话以及文生图等能力,ViT统一图文多模态架构。那模型是如何处理图文信息以及不同处理所带来的能力是怎…...
基于Springboot + vue3实现的流动摊位管理系统
项目描述 本系统包含管理员、用户、商家三个角色。 管理员角色: 用户管理:管理系统中所有用户的信息,包括添加、删除和修改用户。 配置管理:管理系统配置参数,如上传图片的路径等。 权限管理:分配和管理…...
我的软考经历
说明:本文分享博主软考经验,及软考证书在找工作时的作用。 软考 软考,全称:中国计算机技术与软件专业技术资格(水平)考试,报名/考试/查询网址为,中国计算机技术职业资格网 考试分…...
C++的异常
引入:异常的意义是什么? ①:错误分离 将正常逻辑(try)与错误处理(catch)分离,避免代码被大量 if-else 污染。 ②:强制处理 若不捕获异常,程序终止,…...
精益制造数字化转型智能工厂三年规划建设方案
该文档是精益制造数字化转型智能工厂三年规划建设方案,以打造高品质、低成本、柔性化的绿色智能工厂为愿景,围绕制造技术、自动化、数智化、管理赋能四大路径,通过夯实 EHS、品质一致性、生产安定化、现场整洁四大基石,推进标杆车间打造、联合管理、TOB 流程改善等专项。规…...
Linux 文件(3)
文章目录 1. Linux下一切皆文件2. 文件缓冲区2.1 缓冲区是什么2.2 缓冲区的刷新策略2.3 为什么要有缓冲区2.4 一个理解缓冲区刷新的例子 3. 标准错误 1. Linux下一切皆文件 在刚开始学习Linux的时候,我们就说Linux下一切皆文件——键盘是文件,显示器是文…...