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

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

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

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

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