超实用!一篇文章讲透分布式锁,建议收藏!

分布式锁是在分布式系统环境下,确保多个节点(可能位于不同机器或不同地理位置)对共享资源的互斥访问,从而避免数据不一致和竞争条件。

它是现代微服务应用(分布式应用)架构解决并发控制问题的关键技术,也是面试中的常客了,今天咱们来盘点一下分布式锁的 3 种常见实现方案。

1.基于Redis的分布式锁

这是分布式锁最常见的实现方案,因为 Redis 本身为分布式组件,所以 Redis 实现的锁就天然的分布式锁:

基于 Redis 的分布式的实现方案也有以下几种:

  1. setnx(set if Not eXists) :尝试设置键 key 的值为 value,但如果 key 已经存在,则不会执行任何操作并返回 0,如果 key 不存在则加锁成功。
    • 缺陷:存在死锁问题、锁误删问题、不可重入问题、锁无法自动续期问题。
  2. set nx ex/px :setnx 升级版本,Redis 2.6 版本后才能支持此语法。尝试加锁和设置锁超时时间,使用案例 set key value nx px 3000。
    • 缺陷:存在锁误删问题、不可重入问题、锁无法自动续期问题。
  3. Lua 脚本 :解决锁重入的问题
    • 缺陷:实现复杂、且存在锁无法自动续期问题。
  4. Redisson 框架:基于 Redis 实现分布式锁的开源框架。其实现简单、不存在锁重入和锁续期等问题。

可用于生成环境的实现方式为 Redisson 框架实现的分布式锁,它底层是基于 Redis 主线程执行任务为单线程 + Set 命令的原子性来加锁的,核心命令:SET key value NX EX 命令:

  • NX:仅当 KEY 不存在时设置,保证互斥;
  • EX:设置过期时间,防止死锁;
  • value:拥有者 ID,防止误删锁。

但它实现简单,不存在锁重入、锁误删、解决了锁续期的问题,所以常被用于生产环境。

2.基于Zookeeper的分布式锁

ZooKeeper 提供强一致性和顺序性,适合实现高可靠分布式锁。

它的实现原理:

  1. 创建一个持久父节点,如 /locks;
  2. 每个客户端尝试获取锁时,在该父节点下创建一个临时顺序节点,如 /locks/lock_000000001;
  3. 客户端获取所有子节点并排序,检查自己创建的节点是否为最小节点;
  4. 若是最小节点,则获得锁;否则监听前一个节点的删除事件;
  5. 释放锁时删除自己的临时节点,ZooKeeper 自动通知下一个节点。

优点:

  1. 临时节点在客户端断开连接后自动删除,避免死锁;
  2. 顺序节点保证公平性;
  3. Watch 机制实现高效通知。

缺点:

  1. 依赖 ZooKeeper 集群,运维复杂;
  2. 网络抖动可能导致临时节点被误删。

3.基于数据库的分布式锁

最简单的实现方式是创建一张锁表,包含资源名称(唯一索引)和持有者信息。加锁时插入记录,利用数据库的唯一约束保证互斥;释放锁时删除记录。

它的缺点是性能差、存在单点故障、无法自动释放(若客户端宕机)。改进方式包括引入过期时间字段,配合定时任务清理,但存在精度问题和性能问题。

小结

分布式锁的常见实现方案有:基于 Redis 的分布式锁实现、基于 Zookeeper 的分布式锁实现,以及基于数据库的分布式锁实现,但其中使用 Redisson 框架(基于 Redis 实现)实现分布式锁的方案使用的最多,因为它无需单独部署中间件服务,并且使用简单,不存在锁重入和解决了锁续期等问题。

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:场景题、SpringAI、SpringAIAlibaba、并发编程、MySQL、Redis、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、JVM、设计模式、消息队列、Dify、Coze、AI常见面试题等。

相关推荐
golang学习记3 分钟前
IDEA 2026.3 远程开发迎来重磅升级
java·ide·intellij-idea·远程开发
天天被压力23 分钟前
【A股分钟级高频数据完全手册 #04】指数分钟级行情数据接口:沪深指数Pro版最新分时取数
java·人工智能·python
利威尔xu24 分钟前
2026-11-05-Go内存管理面试
面试·golang
敲代码的小小酥27 分钟前
谈SpringMVC与Spring WebFlux的区别与适用场景
java·后端·spring
IT_陈寒27 分钟前
Redis开发实战:从入门到精通
前端·人工智能·后端
日日大王学编程29 分钟前
2026主流AI Agent产品分类、核心差异与技术特性全解析
人工智能·后端·python
天天被压力33 分钟前
【A股分钟级高频数据完全手册 #03】股票历史1分钟K线数据接口怎么用:Pro版批量拉取与本地缓存
java·人工智能·python
apcipot_rain40 分钟前
C++转Java日记(02)
java·开发语言·c++
nice_lcj5201 小时前
【从零理解 Spring AI · 03】Spring AI 在 Spring 生态里的位置
java·spring boot·大模型·spring ai·ai应用开发
mldong1 小时前
同一个节点接力办几轮,流程才往下走:jeeflow 的后加签
后端·架构