Redis 分布式锁:从原理到 Spring Boot 实战,避开 90% 开发者踩的坑!

视频看了几百小时还迷糊?关注我,几分钟让你秒懂!

在分布式系统中,多个服务实例同时操作共享资源(如扣减库存、生成订单号)时,必须使用分布式锁来保证数据一致性。而 Redis 凭借其高性能和原子操作,成为实现分布式锁的首选方案。

但!看似简单的SETNX,背后却隐藏着无数陷阱:锁失效、死锁、主从切换丢锁、误删他人锁……稍有不慎,轻则数据错乱,重则资损事故!

本文将带你:

  • ✅ 深入理解 Redis 分布式锁的核心原理
  • ✅ 用Java + Spring Boot实现高可用、可重入、防误删的分布式锁
  • ✅ 揭露 4 大经典反例与生产级避坑指南

一、为什么需要分布式锁?

🎯 场景:电商秒杀扣库存

// 单机环境下,synchronized 足够 public void deductStock(Long productId) { synchronized (this) { int stock = getStockFromDB(productId); if (stock > 0) { updateStock(productId, stock - 1); // 扣减 } } }

问题:当部署多个服务实例(如 3 台服务器),synchronized只在 JVM 内生效,无法跨进程同步

✅ 解决方案:Redis 分布式锁

  • 所有实例竞争同一把“Redis 锁”
  • 谁拿到锁,谁操作数据库
  • 保证同一时间只有一个实例执行关键代码

二、基础版:SETNX + EXPIRE(❌ 有致命缺陷!)

❌ 反例 1:非原子操作 → 死锁风险

// 错误写法! Boolean locked = redisTemplate.opsForValue().setIfAbsent("lock:order", "1"); if (locked) { // 设置过期时间(防止业务卡死导致锁永不过期) redisTemplate.expire("lock:order", 10, TimeUnit.SECONDS); try { // 执行业务... } finally { redisTemplate.delete("lock:order"); // 释放锁 } }

🔥 问题分析:

  • setIfAbsent()expire()两个命令,非原子!
  • 如果在setIfAbsent成功后、expire执行前,服务宕机 →锁永不过期 → 死锁!

三、正确姿势 1:SET 命令原子加锁(Redis 2.6.12+)

Redis 的SET命令支持NX(不存在才设) +EX/PX(自动过期)组合,原子性保证

✅ Spring Boot 实现(基础版)

public boolean tryLock(String lockKey, String requestId, long expireTimeMs) { Boolean result = redisTemplate.execute( (RedisCallback<Boolean>) connection -> connection.set( lockKey.getBytes(), requestId.getBytes(), Expiration.milliseconds(expireTimeMs), RedisStringCommands.SetOption.SET_IF_ABSENT ) ); return Boolean.TRUE.equals(result); } public void unlock(String lockKey, String requestId) { // 注意:这里仍有问题!见下文 redisTemplate.delete(lockKey); }

📌关键点

  • requestId:建议用UUID + 线程ID,用于标识锁持有者
  • expireTimeMs:必须设置,防止死锁

❌ 但!解锁仍有问题:可能误删他人锁!

假设:

  • 服务 A 拿到锁,但业务执行超时(>10s),锁自动过期
  • 服务 B 拿到同一把锁
  • 此时服务 A 执行完,调用delete(lockKey)删掉了服务 B 的锁!

四、正确姿势 2:Lua 脚本保证“判断+删除”原子性

要安全释放锁,必须满足:

只有锁的持有者(requestId 匹配)才能删除锁

这需要先 GET 判断值,再 DEL,但两步操作非原子 → 必须用Lua 脚本

✅ 安全解锁 Lua 脚本

-- unlock.lua if redis.call("GET", KEYS[1]) == ARGV[1] then return redis.call("DEL", KEYS[1]) else return 0 end

✅ Spring Boot 集成

@Component public class RedisDistributedLock { @Autowired private StringRedisTemplate redisTemplate; private static final DefaultRedisScript<Long> UNLOCK_SCRIPT; static { UNLOCK_SCRIPT = new DefaultRedisScript<>(); UNLOCK_SCRIPT.setLocation(new ClassPathResource("lua/unlock.lua")); UNLOCK_SCRIPT.setResultType(Long.class); } public boolean tryLock(String lockKey, String requestId, long expireTimeMs) { Boolean result = redisTemplate.opsForValue() .setIfAbsent(lockQey, requestId, Duration.ofMillis(expireTimeMs)); return Boolean.TRUE.equals(result); } public void unlock(String lockKey, String requestId) { redisTemplate.execute(UNLOCK_SCRIPT, Collections.singletonList(lockKey), requestId); } }

优势:Lua 脚本在 Redis 中原子执行,杜绝误删!


五、进阶需求:可重入锁 & 自动续期

问题 1:同一线程能否多次获取同一把锁?(可重入)

  • 场景:方法 A 加锁 → 调用方法 B(也需要同一把锁)
  • 基础版会阻塞 → 需要可重入锁

问题 2:业务执行时间 > 锁过期时间?(自动续期)

  • 如锁 TTL=30s,但业务需 60s → 锁提前释放 → 并发安全失效

✅ 解决方案:Redisson(生产推荐!)

Redisson是 Redis 官方推荐的 Java 客户端,内置可重入、自动续期、看门狗机制的分布式锁。

Maven 引入
<dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.23.5</version> </dependency>
Spring Boot 使用
@Service public class OrderService { @Autowired private RedissonClient redissonClient; public void createOrder() { RLock lock = redissonClient.getLock("lock:order:create"); try { // 尝试加锁,最多等待 10 秒,上锁后 30 秒自动解锁 boolean locked = lock.tryLock(10, 30, TimeUnit.SECONDS); if (!locked) { throw new RuntimeException("获取锁失败"); } // 执行业务(即使超过 30 秒,Redisson 会自动续期!) doCreateOrder(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); // 可重入:只有最外层 unlock 才真正释放 } } }

🌟Redisson 核心机制

  • 看门狗(Watchdog):只要线程持有锁,每隔 10s 自动续期(TTL 重置为 30s)
  • 可重入计数:同一线程多次加锁,内部计数器 +1,unlock 时 -1,归零才释放
  • 公平锁/读写锁:支持更复杂场景

六、四大经典陷阱与避坑指南

陷阱后果解决方案
非原子加锁死锁SET key val NX EX 10原子命令
无标识解锁误删他人锁用 Lua 脚本校验 requestId
锁过期时间固定业务未完成锁已丢用 Redisson 自动续期
主从架构丢锁主节点宕机,从节点未同步锁 → 多个客户端同时持锁使用RedLock(争议大)或ZooKeeper / ETCD

⚠️关于 RedLock
Redis 作者提出的一种多节点容错方案,但 Martin Kleppmann 等专家指出其在时钟漂移场景下仍不安全。一般业务建议用 Redisson + 单 Redis 实例(高可用由哨兵/Cluster 保证)即可


七、总结:分布式锁最佳实践

  1. 永远不要用SETNX + EXPIRE分开写!
  2. 解锁必须用 Lua 脚本校验持有者 ID!
  3. 业务时间不确定?上 Redisson!
  4. 高可用靠 Redis 哨兵/Cluster,而非 RedLock!
  5. 锁的粒度尽量小,减少持有时间!

结语

分布式锁看似简单,实则暗流涌动。一个没有自动续期、没有持有者校验的锁,等于没有锁!

在生产环境中,强烈建议直接使用 Redisson,它已经帮你踩平了所有坑。自己造轮子?除非你愿意承担资损风险!

视频看了几百小时还迷糊?关注我,几分钟让你秒懂!

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

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

相关文章

哈尔滨市依兰方正宾县巴彦木兰英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜

在留学热潮持续升温的当下,雅思成绩作为全球认可度最高的语言能力证明,成为众多学子申请海外院校的“敲门砖”。然而,哈尔滨依兰、方正、宾县、巴彦、木兰等县域地区的雅思考生,常面临优质培训资源匮乏、备考方向迷…

专为上海企业打造:2026年阿里云企业邮箱优质服务商全面解析

上海作为中国经济的核心引擎,聚集了大量跨国企业、创新型中企及初创团队。在数字化转型浪潮中,企业如何通过高效、安全的邮箱服务提升协作效率、降低运营成本?阿里云企业邮箱凭借其技术实力与服务经验,成为上海企业…

Redis 集群(Cluster)详解:从原理到 Spring Boot 实战,彻底告别单点故障!

视频看了几百小时还迷糊&#xff1f;关注我&#xff0c;几分钟让你秒懂&#xff01; 在高并发、大数据量的生产环境中&#xff0c;单机 Redis 早已无法满足需求&#xff1a;内存有限、性能瓶颈、单点故障……一旦宕机&#xff0c;整个系统雪崩&#xff01; 为了解决这些问题&a…

哈尔滨市通河延寿尚志五常英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜

在雅思备考热潮持续升温的当下,哈尔滨市通河、延寿、尚志、五常地区的考生却深陷多重困境:优质雅思培训资源地域分布不均,难以精准匹配全阶段备考需求;缺乏权威的测评与推荐指引,在海量教育机构中难以筛选出靠谱的…

2026年企业如何选择?阿里云邮箱优质服务商推荐与全方位对比指南

企业邮箱已从基础通信工具升级为协同办公的核心枢纽。面对市场上众多服务商,如何选择既满足安全需求、又能提升效率的邮箱系统?本文将以阿里云邮箱为例,从技术、功能、服务、成本等维度展开分析。 一、技术架构:云…

保存一条数据到 Redis 的全过程:从客户端到内存存储,深入底层细节(附 Spring Boot 实战)

视频看了几百小时还迷糊&#xff1f;关注我&#xff0c;几分钟让你秒懂&#xff01; 你是否曾好奇&#xff1a;当你在 Java 代码中调用 redisTemplate.opsForValue().set("user:1001", "张三") 时&#xff0c;Redis 内部到底发生了什么&#xff1f; 一条数…

【收藏级】AI大模型学习路线全解析:抓准缺人风口,实现职业跃迁

本文整理了一套完整可落地的AI大模型学习路线&#xff0c;重点点明&#xff1a;后训练&#xff08;SFT、RLHF/DPO&#xff09;与AI-Agent两大方向&#xff0c;是当前工业界人才缺口最大、普通人入局性价比最高的赛道。路线涵盖6大核心模块——大模型基础认知、核心技术&#xf…

Redis 过期与淘汰策略深度解析:从原理到 Spring Boot 实战,彻底搞懂内存管理机制!

视频看了几百小时还迷糊&#xff1f;关注我&#xff0c;几分钟让你秒懂&#xff01; 在使用 Redis 时&#xff0c;你是否遇到过这些问题&#xff1a; 缓存数据明明设置了过期时间&#xff0c;为什么还占着内存不释放&#xff1f;Redis 内存爆了&#xff0c;新数据写不进去&…

PPIO × 商汤 LazyLLM: 一站式构建 Multi-Agent |实操指南

随着大模型技术从单一对话向多智能体&#xff08;Agent&#xff09;协作演进&#xff0c;如何低成本、高效率地完成应用开发与落地成为行业焦点。 近日&#xff0c;PPIO 正式与 LazyLLM 达成深度合作&#xff0c;通过 LazyLLM 的统一接口和灵活的编排能力&#xff0c;配合 PPIO…

2026公务车定制厂家推荐:实力品牌与专业定制方案解析

公务车定制是针对特定行业功能需求、场景适配及使用习惯开展的个性化车辆设计服务,通过对车型性能、配置、外观等方面的专属优化,为政务、警务、民生服务等领域提供适配性更强的出行工具。一、主要业务场景车型特点外…

分析诚信的豪雅新乐学配镜机构,北京靠谱的有哪些?

随着儿童近视率逐年攀升,家长们对近视防控镜片的需求愈发迫切,其中豪雅新乐学作为主流防控镜片之一,因临床数据显示可平均延缓近视加深67%,成为众多家庭的选择。但家长们在挑选配镜机构时,往往被资质是否正规镜片…

收藏!30+程序员破局35岁危机:从Java后端到大厂大模型岗的实战指南

各位30的程序员同行&#xff0c;你是否也曾在深夜对着电脑屏幕陷入沉思&#xff1a;手头的CRUD工作日渐机械&#xff0c;职业晋升通道一眼就能望到尽头&#xff0c;看着身边20多岁的同事轻松驾驭新框架&#xff0c;还能毫无压力地通宵加班——这一刻&#xff0c;你是不是也在怀…

域名系统支撑无人机网络身份认证及IPv6创新应用研究

编者按&#xff1a;中国互联网络信息中心以互联网域名管理技术国家工程实验室为平台&#xff0c;紧扣网络强国与数字中国建设重大战略需求&#xff0c;持续开展了围绕域名系统支撑算力网络、卫星互联网、区块链异构网络、量子电子混合计算网络等下一代互联网服务架构、标识技术…

工业设计公司服务找哪家,京津冀璞新科技优势盘点

2026年制造业与科技产业深度融合,工业设计已成为企业提升产品竞争力、实现品牌价值跃迁的核心支点。无论是医疗器械的人机工学优化、机器人的结构创新,还是新能源产品的外观与功能融合,优质工业设计公司的专业能力直…

录屏老翻车?那是你没遇到sunwoo录屏大师!

做自媒体或者经常需要做教程的朋友&#xff0c;应该都经历过被“录屏”折磨的日子。 用系统自带的 Xbox Game Bar 吧&#xff0c;功能太简陋&#xff0c;想录个带摄像头的窗口都费劲&#xff1b;用那些大名鼎鼎的商业软件吧&#xff0c;要么收费贵得离谱&#xff0c;要么免费版…

收藏级指南|大模型SFT与RL核心训练调优技巧,小白也能看懂

本文系统拆解大模型微调&#xff08;SFT&#xff09;与强化学习&#xff08;RL&#xff09;的核心技术要点&#xff0c;聚焦实操落地能力&#xff0c;专为程序员及大模型入门者打造。SFT部分重点拆解Prompt设计、高质量数据集构建、参数调优逻辑&#xff1b;RL部分深入讲解奖励…

Redis 为什么这么快?深入解析高性能背后的秘密(附 Spring Boot 实战)

视频看了几百小时还迷糊&#xff1f;关注我&#xff0c;几分钟让你秒懂&#xff01; 在高并发系统中&#xff0c;Redis 几乎成了“标配”。无论是缓存、限流、分布式锁&#xff0c;还是实时排行榜、消息队列&#xff0c;Redis 都能轻松应对。但你有没有想过&#xff1a;为什么 …

婴幼儿喘息怎么办?布咳乐F6高性能罐式雾化器填补市场关键空白

如何让哮喘患儿的雾化治疗更加精准高效&#xff1f;这不仅是万千家长关注的焦灼点&#xff0c;也是儿科呼吸治疗领域亟待突破的课题。2026年初&#xff0c;高端雾化器品牌布咳乐全新产品F6系列新一代高性能罐式雾化器正式上市。该系列产品包含F6 Baby婴幼儿罐式雾化器和F6 Kids…

讲讲上海新房除甲醛品牌供应商,生态美家哪家性价比高?

随着人们对室内健康的关注度不断提升,新房除甲醛已成为装修后的刚需环节,但市场上鱼龙混杂的服务让很多家庭陷入选择困境。本文聚焦知名的新房除甲醛专业公司新房除甲醛品牌供应商有实力的新房除甲醛专业公司三大核心…

基于供应链数据泄露的硬件钱包钓鱼攻击分析与防御机制研究

摘要 2026年初&#xff0c;加密货币硬件钱包厂商Ledger披露其第三方电商合作伙伴Global-e发生数据泄露事件&#xff0c;导致部分客户的身份信息与订单记录外泄。随后&#xff0c;攻击者利用泄露数据发起高度定制化的钓鱼攻击&#xff0c;伪造“Ledger与Trezor合并”通知&#…