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

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

2025-08-16 12:32:16 栏目:宝塔面板 97 阅读

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

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

1.基于Redis的分布式锁

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

图片

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

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

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

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

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

2.基于Zookeeper的分布式锁

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

它的实现原理:

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

优点:

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

缺点:

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

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

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

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

小结

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

本文地址:https://www.yitenyun.com/316.html

搜索文章

Tags

数据库 API FastAPI Calcite 电商系统 MySQL Web 应用 异步数据库 数据同步 ACK 双主架构 循环复制 TIME_WAIT 运维 负载均衡 服务器 管理口 JumpServer SSL 堡垒机 跳板机 HTTPS HexHub Docker 服务器性能 JumpServer安装 堡垒机安装 Linux安装JumpServer SQL 查询 Deepseek 宝塔面板 Linux宝塔 生命周期 esxi esxi6 root密码不对 无法登录 web无法登录 序列 核心机制 锁机制 Windows Windows server net3.5 .NET 安装出错 行业 趋势 HTTPS加密 开源 PostgreSQL 存储引擎 Windows宝塔 Mysql重置密码 宝塔面板打不开 宝塔面板无法访问 查看硬件 Linux查看硬件 Linux查看CPU Linux查看内存 机器学习 Redis Undo Log 机制 Oracle 处理机制 Spring 动态查询 无法访问宝塔面板 响应模型 优化 万能公式 InnoDB 数据库锁 异步化 连接控制 Serverless 无服务器 语言 监控 ES 协同 工具 group by 索引 openHalo Postgres OTel Iceberg 技术 高可用 缓存方案 缓存架构 缓存穿透 分页查询 scp Linux的scp怎么用 scp上传 scp下载 scp命令 存储 SVM Embedding 数据 主库 国产数据库 GreatSQL 连接数 日志文件 MIXED 3 Linux 安全 R edis 线程 R2DBC SQLite-Web SQLite 数据库管理工具 Netstat Linux 服务器 端口 加密 场景 OB 单机版 Recursive 启动故障 防火墙 黑客 云原生 RocketMQ 长轮询 配置 ​Redis 推荐模型 SQLark 自定义序列化 AI 助手 向量数据库 大模型 共享锁 PG DBA Canal 信息化 智能运维 Hash 字段 Rsync 不宕机 Python 向量库 Milvus 同城 双活 Ftp 磁盘架构 电商 系统 业务 IT运维 分库 分表 架构 修改DNS Centos7如何修改DNS 语句 聚簇 非聚簇 PostGIS 传统数据库 向量化 filelock 数据分类 流量 频繁 Codis 线上 库存 预扣 MongoDB 数据结构 MVCC MCP 开放协议 缓存 失效 • 索引 • 数据库 redo log 重做日志 MySQL 9.3 mini-redis INCR指令 Web 接口 开发 数据类型 sftp 服务器 参数 人工智能 推荐系统 ZODB 工具链 Doris SeaTunnel 千万级 大表 分布式架构 分布式锁​ Redisson 锁芯 聚簇索引 非聚簇索引 EasyExcel MySQL8 INSERT 数据备份 高效统计 今天这篇文章就跟大家 prometheus Alert 窗口 函数 虚拟服务器 虚拟机 内存 事务 Java 主从复制 代理 容器 崖山 新版本 COMPACT 发件箱模式 SSH Web 网络架构 网络配置 分页 引擎 性能 数据脱敏 加密算法 RDB AOF MGR 分布式集群 网络故障 核心架构 订阅机制 自动重启 容器化 QPS 高并发 B+Tree ID 字段 播客 分布式 集中式 数据页 Redis 8.0 数据集成工具 读写 速度 服务器中毒 Go 数据库迁移 OAuth2 Token Redka 模型 SpringAI StarRocks 数据仓库 微软 SQL Server AI功能 DBMS 管理系统 Entity 排行榜 排序 池化技术 连接池 Valkey Valkey8.0 JOIN 关系数据库 Caffeine CP 事务隔离 原子性 业务场景 LRU Weaviate 数据字典 兼容性 网络 部署 Testcloud 云端自动化 dbt 数据转换工具 分页方案 排版 Pottery 1 ReadView 事务同步 优化器 UUID ID sqlmock 日志 AIOPS InfluxDB 悲观锁 乐观锁 意向锁 记录锁 单点故障 仪表盘 Pump 单线程 UUIDv7 主键 Ansible 对象 Order 编程 Crash 代码 RAG HelixDB 分布式锁 Zookeeper 产业链 字典 双引擎 IT 恢复数据 订单 List 类型 拦截器 动态代理 LLM 国产 用户 线程安全 慢SQL优化 表空间 快照读 当前读 视图 解锁 调优 RR 互联网 Next-Key count(*) count(主键) 行数 神经系统 GitHub Git 矢量存储 数据库类型 AI代理 CAS 查询规划 技巧 算法 多线程 闪回 并发控制 恢复机制