news 2026/5/5 2:19:01

[后端进阶] 详解分布式锁的三种实现方式:MySQL vs Redis vs ZooKeeper

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[后端进阶] 详解分布式锁的三种实现方式:MySQL vs Redis vs ZooKeeper

在微服务架构或分布式系统中,Java 内置的锁(如synchronizedReentrantLock)只能限制当前 JVM 内部的线程互斥。当我们需要跨多个服务节点、跨进程地去抢占同一个资源(如“扣减库存”、“抢单”)时,就需要引入分布式锁

本文将深入对比业界常见的三种分布式锁实现方案:MySQLRedisZooKeeper,解析其原理、代码实现及优缺点。


一、基于 MySQL 实现分布式锁

MySQL 实现分布式锁主要利用了数据库的唯一性约束或排他锁(X锁)特性。

1. 方案 A:基于唯一索引 (Unique Index)

这是最直观的方法。我们创建一个锁表,并对lock_key字段加上唯一索引。

  • 加锁:执行INSERT INTO lock_table (lock_key) VALUES ('order_101');。如果插入成功,则获取锁;如果报Duplicate Key Error,则获取失败。

  • 解锁:执行DELETE FROM lock_table WHERE lock_key = 'order_101';

2. 方案 B:基于排他锁 (SELECT ... FOR UPDATE)

利用 MySQL 的事务机制,通过FOR UPDATE对某一行数据加排他锁。

START TRANSACTION; -- 阻塞式等待获取锁 SELECT * FROM distributed_lock WHERE lock_key = 'order_101' FOR UPDATE; -- 执行业务逻辑... COMMIT; -- 提交事务即释放锁
⚠️ 致命注意点:必须加索引!

在使用FOR UPDATE时,WHERE后面的字段(如lock_key必须有索引

  • 有索引:MySQL 使用行锁(Row Lock),只锁住这一行,并发互不影响。

  • 无索引:MySQL 无法定位行,会进行全表扫描,进而导致锁表。这会让系统的并发能力瞬间降为 1,甚至导致数据库连接池爆满导致服务崩溃。

优缺点分析
  • 优点:理解简单,不需要引入额外的中间件(利用现有数据库)。

  • 缺点

    • 性能差:依赖磁盘 I/O,并发支持有限。

    • 死锁风险:基于 INSERT 的方案如果服务宕机,锁无法自动释放(需额外开发定时清理任务)。

    • 连接资源宝贵:基于FOR UPDATE的方案会长时间占用数据库连接。


二、基于 Redis 实现分布式锁(推荐)

这是目前互联网企业最常用的方案,核心优势是高性能

1. 核心原理

早期我们使用SETNX(Set if Not Exists) 指令,但在生产环境中,推荐使用Redisson框架,它封装了复杂的底层逻辑。

  • 互斥:利用 Redis 的原子操作,同一时刻只有一个客户端能设置成功。

  • 防死锁:设置过期时间(TTL)。

  • 自动续期(看门狗 Watchdog):这是 Redisson 的黑科技。如果业务逻辑执行时间超过了锁的过期时间,看门狗会起一个后台线程,每隔一段时间自动给锁“续命”,防止业务没跑完锁就过期了。

2. Java 代码示例 (Redisson)
@Autowired private RedissonClient redisson; public void doBusiness() { RLock lock = redisson.getLock("my-lock"); try { // 尝试加锁,支持自动续期 lock.lock(); // 执行业务... System.out.println("Processing..."); } finally { // 释放锁前判断是否是当前线程持有 if (lock.isLocked() && lock.isHeldByCurrentThread()) { lock.unlock(); } } }
优缺点分析
  • 优点:性能极高(纯内存操作),实现简单(Redisson 封装极其完善),支持可重入。

  • 缺点AP 模型(弱一致性)。在 Redis 哨兵或集群模式下,如果主节点还没来得及把锁同步给从节点就挂了,从节点升级为主节点后,锁会丢失,可能导致两个线程同时持锁。


三、基于 ZooKeeper 实现分布式锁

ZooKeeper (ZK) 保证 CP(强一致性),适用于对可靠性要求极高的场景(如金融核心系统)。通常配合Curator客户端使用。

1. 核心原理

利用 ZK 的临时顺序节点 (Ephemeral Sequential Node)

  1. 抢锁:所有客户端在/lock目录下创建一个临时顺序节点。

  2. 判断:获取所有子节点,判断自己的序号是不是最小的。如果是,获得锁。

  3. 等待:如果不是最小,监听(Watch)比自己小 1 号的那个节点。

  4. 释放:前一个节点删除(释放锁或宕机),当前节点收到通知,获得锁。

优缺点分析
  • 优点

    • 强一致性:不存在 Redis 的丢锁问题。

    • 安全性高:因为是临时节点,客户端宕机后节点自动消失,天然杜绝死锁

  • 缺点:性能不如 Redis,频繁创建和删除节点对 ZK 集群压力较大。


四、总结与选型建议

维度MySQLRedis (Redisson)ZooKeeper
底层机制唯一索引 / 行锁SETNX / Lua 脚本临时顺序节点
性能低 (磁盘I/O)极高 (内存)中 (网络/磁盘)
一致性强 (依赖事务)弱 (主从切换可能丢锁)强 (CP模型)
死锁风险高 (需兜底策略)低 (看门狗机制)无 (断开即释放)
复杂度手动实现麻烦框架封装好框架封装好

选型建议:

  1. 绝大多数互联网业务(90%):首选Redis (Redisson)。即使极端情况下偶尔丢锁,通过业务层的幂等性校验也能兜底,性能收益巨大。

  2. 金融级/对一致性极其敏感的场景:首选ZooKeeper。宁可慢一点,也不能出差错。

  3. 极小规模/不想引入新组件:可以使用MySQL,但务必记得给锁字段加唯一索引,防止锁全表导致系统崩溃。


作者提示:技术选型没有绝对的“最好”,只有“最适合”。在面试中回答此问题时,建议先说出 Redis 的方案,再对比 ZK 的强一致性优势,最后提一下 MySQL 的实现原理及坑点,展现你的知识广度。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 6:20:05

Comsol超构表面动量空间参数图绘制指南

Comsol 超构表面动量空间参数图绘制在超构表面研究领域,绘制动量空间参数图对于理解超构表面的光学特性至关重要。Comsol作为一款强大的多物理场仿真软件,为我们提供了实现这一目标的有效途径。今天就来聊聊如何在Comsol里绘制超构表面动量空间参数图。…

作者头像 李华
网站建设 2026/5/1 11:03:06

Linux线程控制

一、互斥:临界资源的排他性访问1. 核心概念互斥,即对临界资源的排他性访问,是多线程安全的基础。临界资源:多线程环境下,会被多个线程同时读写的资源,比如全局变量、文件句柄、硬件设备等。这类资源的读写操…

作者头像 李华
网站建设 2026/5/3 7:04:35

永磁同步电机MotorCAD仿真详细流程揭秘

某永磁同步电机motorcad仿真流程,很详细 录制video文档最近在研究永磁同步电机的相关内容,发现MotorCAD这个软件在永磁同步电机仿真方面真的非常强大。今天就来给大家分享一下永磁同步电机MotorCAD的详细仿真流程,同时我还录制了配套的video,…

作者头像 李华
网站建设 2026/4/28 0:07:47

跳出“要么稳要么冲”陷阱:广告预算的确定性与增长性双驱法则

在亚马逊运营中,广告预算分配是一场精密的资源调度艺术,如何在“确保盈利”的确定性与“追求增长”的探索性之间找到平衡,是卖家必须掌握的核心能力。一、锚定底层逻辑:不同生命周期的预算哲学广告预算的设定,必须始于…

作者头像 李华
网站建设 2026/5/1 5:26:18

上海交大造出手机AI助手ColorAgent:不只是工具,更像贴心伙伴

这项突破性研究由上海交通大学与OPPO研究院联合完成,研究成果发表于2025年10月22日的arXiv预印本平台,论文编号为arXiv:2510.19386v1。研究团队由来自上海交通大学的李宁、吴正、张伟明等多位学者,以及OPPO研究院的林旗强、莫晓芸、赵音等专家…

作者头像 李华
网站建设 2026/5/3 18:22:32

机器视觉介绍

机器视觉的定义机器视觉(Machine Vision)是指通过计算机和图像处理技术模拟人类视觉功能,实现对物体识别、测量、定位和分析的自动化系统。广泛应用于工业检测、自动驾驶、医疗影像等领域。机器视觉的核心技术图像采集 通过摄像头、工业相机或…

作者头像 李华