Redis 分布式锁进阶第七十二篇

承接上一篇锁超时、主从丢锁、集群脑裂三大生产问题,本篇聚焦 Redisson 中三类高频进阶锁:公平锁、异步锁、读写锁。分别讲解设计原理、适用场景、底层逻辑、核心代码与线上使用规范,区分不同业务场景该如何选型,同时对比普通非公平锁的差异,补齐分布式锁完整知识体系。

一、开篇导读

前面篇章讲解的均为 Redisson 默认非公平可重入锁,线程抢锁全凭竞争,不区分等待顺序。在实际业务中,会遇到排队有序执行、异步无阻塞加锁、读写分离并发控权等场景,普通锁无法满足诉求。 本篇依次拆解三大进阶锁:公平锁解决排队顺序问题、异步锁适配非阻塞编程模型、读写锁区分读 / 写并发权限,同时附带 Lua 核心逻辑、调用示例、优缺点与落地禁忌。

二、Redisson 公平锁(FairLock)

2.1 适用场景

非公平锁下,新线程可能直接插队抢到锁,长期等待的线程会出现线程饥饿 。 公平锁严格按照请求加锁的先后顺序分配锁资源,保证先来先执行。 典型场景:消息队列消费、任务排队执行、顺序化业务流程、需要严格保证请求时序的接口。

2.2 底层数据结构与核心原理

公平锁在普通 Hash 锁基础上,额外借助 List 队列 + 发布订阅 实现排队机制:

  1. 基础锁结构:依旧使用 Hash 存储线程标识与重入次数,保留可重入特性;
  2. 排队队列:单独维护一个 List 结构,记录所有等待锁的线程标识,按照入队顺序排序;
  3. 竞争规则:锁释放后,从队列头部取出第一个等待线程分配锁,杜绝插队;
  4. 唤醒机制:结合发布订阅,锁释放后依次唤醒队列内线程,有序竞争。

2.3 核心运行流程

  1. 线程尝试加锁,若锁空闲,直接获取锁执行业务;
  2. 锁被占用时,将当前线程信息存入等待队列,订阅消息并阻塞;
  3. 锁持有者解锁后,向频道发送释放通知,同时从队列头部取出首个等待线程;
  4. 被唤醒线程获取锁,其余线程继续排队,全程遵循先来先服务。

2.4 基础使用示例(Java)

java

运行

2.5 优缺点与选型建议

  • 优点:保证执行顺序,彻底解决线程饥饿,时序严格可控;
  • 缺点:多了队列维护、顺序唤醒逻辑,性能略低于非公平锁,高并发下吞吐略有下降;
  • 建议:顺序类业务必用公平锁,高并发抢资源、无顺序要求场景优先默认非公平锁。

三、Redisson 异步锁(AsyncLock)

3.1 适用场景

传统 lock()同步阻塞 模式,线程会一直卡在加锁环节,直到获取锁成功。 异步锁基于 Reactor 异步模型,适配响应式编程、Netty 服务、网关、微服务异步链路,全程不阻塞工作线程,提升线程复用率与系统吞吐。 典型场景:网关接口、异步回调服务、高吞吐中间件、全异步架构项目。

3.2 核心设计特点

  1. 不阻塞当前工作线程,加锁结果通过回调、CompletableFuture 异步返回;
  2. 底层依然复用原有 Lua 脚本、看门狗续期、发布订阅能力,功能与同步锁完全对齐;
  3. 支持可重入、超时等待、自动续期、失败重试等全部特性;
  4. 严格遵循异步编程范式,避免阻塞线程池造成服务卡死。

3.3 常用 API 与代码示例

3.3.1 异步加锁(无阻塞)
相关推荐
字节跳动开源2 小时前
Viking AI 搜索 CLI 正式发布:会说话,就能做搜索推荐
数据库·人工智能·开源
TechWJ3 小时前
数据库在公司内网,出差路上想查数据怎么办?
服务器·数据库·mariadb
我是一颗柠檬3 小时前
【MySQL全面教学】MySQL事务与ACID Day9(2026年)
数据库·后端·mysql
橙子圆1233 小时前
Redis知识9之集群
数据库·redis·缓存
鱼鳞_3 小时前
苍穹外卖-Day08(缓存套餐)
java·redis·缓存
BlackHeart12033 小时前
【SQL】Oracle中序列(Sequence)作为默认值引发的ORA-00979
数据库·sql·oracle
bug菌4 小时前
【SpringBoot 3.x 第254节】夯爆了,数据库访问性能优化实战详解!
数据库·spring boot·后端
xxl大卡4 小时前
MySQL的执行流程
数据库·mysql
chicheese4 小时前
MySQL优化实践:选错JOIN 驱动表,性能相差几十倍
数据库·mysql
無限進步D4 小时前
MySQL 单行函数
数据库·mysql