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

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

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

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

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