Redis 分布式锁实现详解:基于 SET NX + Lua 脚本的互斥性保证 📅 发布时间:2026/7/8 16:53:27 👁️ 浏览次数: Redis 分布式锁实现详解基于 SET NX Lua 脚本的互斥性保证在分布式系统中多个服务实例同时操作同一资源时必须保证同一时刻只有一个实例能执行关键逻辑。这就是分布式锁的核心作用。本文基于一个生产环境中常用的 Redis Spring Boot 实现方案详细讲解为什么其他客户端无法重复获取同一把锁并结合具体代码进行原理分析。一、分布式锁的核心要求一个合格的分布式锁必须满足互斥性任意时刻全局只有一个客户端持有锁。防死锁持有锁的客户端崩溃后锁能自动释放。解锁安全只有加锁的客户端才能释放锁防止误删他人锁。高性能加锁/解锁操作应为原子级。二、Redis 实现方案核心原理本文方案使用Redis 的 SET NX EX 原子命令实现加锁配合Lua 脚本实现安全解锁。核心依赖 Redis 的单线程模型和原子操作确保互斥性。1. 加锁原理tryLock 方法BooleanresultredisTemplate.opsForValue().setIfAbsent(fullLockKey,lockValue,expireTime,TimeUnit.SECONDS);底层等价于 Redis 命令SET lock_prefix:xxx 客户端唯一value NX EX 30NXNot eXists只有 key 不存在时才设置成功。EX同时设置过期时间防止死锁。为什么其他客户端无法重复获取锁Redis 是单线程的所有命令串行执行。当客户端 A 执行 SET NX 时如果 key 不存在 → 设置成功A 获得锁。客户端 B、C 几乎同时到达 → Redis 已经处理完 A 的命令此时 key 已存在B 和 C 的 NX 操作直接失败。关键点Redis 单线程 NX 原子性保证“先到先得”后到的客户端必然看到 key 已存在无法重复设置。因此全局互斥性得到严格保证。2. 解锁原理releaseLock 方法LongresultredisTemplate.execute(redisScript,Collections.singletonList(fullLockKey),lockValue);Lua 脚本原代码版本ifredis.call(get,KEYSp[1]ARGV[1]thenreturnredis.call(del,KEYS[1])elsereturn0endLua 脚本的作用先判断当前 key 的 value 是否等于加锁时设置的 lockValue。只有匹配才执行 DEL。整个脚本在 Redis 服务器端原子执行中间不会被其他命令插入。为什么这能防止后续重复假设 A 持有锁但业务超时锁过期后 B 抢到锁。此时 A 执行解锁Lua 校验 value 不匹配 → 不删除 B 的锁。B 的锁继续有效后续客户端 C 依然无法抢到。如果没有 Lua 直接 DEL就会出现“A 删了 B 的锁 → C 立刻抢到”的连锁反应导致互斥性失效。三、完整代码实现生产可用版建议packagecom.anmory.common.service.impl;importcom.anmory.common.service.DistributeLockService;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.redis.core.StringRedisTemplate;importorg.springframework.data.redis.core.script.DefaultRedisScript;importorg.springframework.stereotype.Service;importjava.util.Collections;importjava.util.concurrent.TimeUnit;/** * 分布式锁服务实现类 */ServiceSlf4jpublicclassDistributeLockServiceImplimplementsDistributeLockService{AutowiredprivateStringRedisTemplateredisTemplate;privatestaticfinalStringLOCK_PREFIXlock_prefix:;privatefinalDefaultRedisScriptLongredisScript;privatestaticfinalStringSCRIPT_TEXTif redis.call(get, KEYSp[1] ARGV[1] then return redis.call(del, KEYS[1]) else return 0 end;publicDistributeLockServiceImpl(){redisScriptnewDefaultRedisScript();redisScript.setScriptText(SCRIPT_TEXT);redisScript.setResultType(Long.class);}OverridepublicbooleantryLock(StringlockKey,StringlockValue,longexpireTime){// 1. 补全完整的keyStringfullLockKeyLOCK_PREFIXlockKey;// 2. 把value写进redisBooleanresultredisTemplate.opsForValue().setIfAbsent(fullLockKey,lockValue,expireTime,TimeUnit.SECONDS);if(result){log.info([redis分布式锁], 获取锁成功, key:{}, value:{},fullLockKey,lockValue);}else{log.error([redis分布式锁], 获取锁失败, key:{}, value:{},fullLockKey,lockValue);}returnresult;}OverridepublicbooleanreleaseLock(StringlockKey,StringlockValue){// 1. 补全完整的keyStringfullLockKeyLOCK_PREFIXlockKey;LongresultredisTemplate.execute(redisScript,Collections.singletonList(fullLockKey),lockValue);booleanreleasedresult!nullresult0;if(released){log.info([redis分布式锁], 释放锁成功, key:{}, value:{},fullLockKey,lockValue);}else{log.error([redis分布式锁], 释放锁失败, key:{}, value:{},fullLockKey,lockValue);}returnreleased;}}注意Lua 脚本中的KEYSp[1]为笔误应修正为KEYS[1]否则脚本执行会报语法错误。生产环境建议修正后重新测试。四、使用示例StringlockKeyorder:12345;StringlockValueUUID.randomUUID().toString();booleanlockedlockService.tryLock(lockKey,lockValue,30);if(locked){try{// 业务逻辑}finally{lockService.releaseLock(lockKey,lockValue);// 必须在 finally 中释放}}五、总结本文实现的 Redis 分布式锁通过以下两点严格保证其他客户端无法重复获取锁加锁阶段Redis 单线程 SET NX EX 原子操作确保全局只有一个客户端能成功设置 key。解锁阶段Lua 脚本原子校验 value防止误删他人锁从而维持后续抢锁的互斥性。该方案轻量、高性能适合大多数中型分布式系统使用。相比 Redisson它更透明、更易理解和调试。欢迎关注、收藏、点赞你的支持是我持续输出的动力
基于社会工程学诱饵的钓鱼攻击演化与多维防御体系构建——以威斯康星州BBB警示案例为实证 摘要 随着数字化进程的加速,网络钓鱼攻击已演变为全球范围内最具破坏力的网络安全威胁之一。攻击者不再单纯依赖技术漏洞,而是深度融合社会工程学原理,利用人类心理弱点构建高迷惑性的诱饵。本文以2026年威斯康星州更好商业局(BBB… 2026/7/6 23:30:26
人工智能应用- 太空探索:06. 火星车上的“智能避障” 着陆火星后,“祝融号”火星车采用“双视觉摄像头 激光雷达”的感知组合,配合 AI 图像处理和深度强化学习算法来分析火星表面的岩石、坑洼、沙丘等。系统会将火星车拍摄的图像送入神经网络,输出“前进”“转向”“减速”等控制指令࿰… 2026/7/6 14:09:26
Windows超级管理器:全面系统优化解决方案 在系统维护领域,Windows超级管理器以其全面的功能配置脱颖而出。 这款工具虽体积小巧,却蕴含强大的系统管理能力。 其核心优势在于将多项高频实用功能整合于单一平台。 用户无需安装多款软件,即可完成大部分系统维护任务。 启动项管理是系… 2026/7/6 23:30:19
Unity Shader进阶:从语法到引擎层原理与性能优化实战 1. 项目概述:深入Shader的“里世界”如果你已经跟着前两篇内容,把Shader的基础语法、光照模型和表面着色器都过了一遍,那恭喜你,你已经成功推开了Shader世界的大门。但门后的世界,远比门口看到的要复杂和精彩。这第三篇… 2026/7/8 16:51:39
如何在Windows上构建完整的AirPlay 2投屏服务器:技术原理与实现深度解析 如何在Windows上构建完整的AirPlay 2投屏服务器:技术原理与实现深度解析 【免费下载链接】airplay2-win Airplay2 for windows 项目地址: https://gitcode.com/gh_mirrors/ai/airplay2-win 你是否曾经思考过,为什么苹果设备之间的AirPlay投屏如此… 2026/7/8 16:51:39
Unity版本升级中命名空间报错的系统性排查与解决方案 1. 项目概述:从一次痛苦的升级说起 如果你是一名Unity开发者,那么“版本升级”这四个字,很可能让你心头一紧。这绝不是简单的点击“更新”按钮,而更像是一次充满未知的探险。我最近就经历了一次从Unity 2019 LTS升级到Unity 2022 … 2026/7/8 16:49:38
3 款主流深度学习可视化工具对比:TensorBoard vs Visdom vs VisualDL 2024 2024年三大深度学习可视化工具深度评测:TensorBoard、Visdom与VisualDL实战指南 在深度学习项目开发中,训练过程可视化已成为模型调优不可或缺的一环。面对TensorBoard、Visdom和VisualDL这三款主流工具,开发者常常陷入选择困境。本文将基于2… 2026/7/8 16:47:35
连云港市30米精度地形高程数据+配套市级行政区划矢量文件 本文还有配套的精品资源,点击获取 简介:包含连云港市全域30米空间分辨率的数字高程模型(DEM)栅格数据,格式为GeoTIFF(.tif),已内置地理配准信息,并附带世界文件&#… 2026/7/8 16:47:35
FreeType实现游戏UI文字描边与发光效果:C++实战指南 1. 项目概述:为什么游戏文字需要描边与发光? 在游戏开发中,UI文字的可读性直接关系到玩家的体验。想象一下,在一个光影交错、背景复杂的游戏场景里,如果文字只是简单地渲染成单一颜色,它很容易被背景“吃掉… 2026/7/8 16:45:22
BetterNCM安装器:高效管理网易云插件的最佳选择 BetterNCM安装器:高效管理网易云插件的最佳选择 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件的繁琐安装流程而烦恼吗?BetterNCM安装器是… 2026/7/8 0:02:48
运动控制系统安全设置对比:ECI3808的3种限位保护与急停逻辑实现 运动控制系统安全机制深度解析:限位保护与急停逻辑的设计哲学在精密制造与自动化领域,运动控制系统的安全设计绝非简单的功能堆砌,而是一套融合了机械工程、电气原理和软件算法的防御体系。当一台数控机床以每分钟数万转的速度运转࿰… 2026/7/8 0:06:48
AI大模型应用开发:小白也能抓住的红利风口,收藏这篇入门指南! 文章指出,虽然微软等科技巨头在裁员,但英伟达等公司却在积极扩招AI相关人才,尤其是具身智能、仿真等领域。AI行业正在经历结构性调整,传统岗位被淘汰,而大模型应用开发等新岗位需求旺盛。对于想转行或学习AI的普通人来… 2026/7/8 0:10:49
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/7 11:26:57
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/8 14:25:08