Spring Boot 中用 Redisson 实现分布式锁和延迟队列,核心是正确初始化 RedissonClient 并使用 RLock 和 RDelayedQueue 原生 API;RLock 支持自动续期与可重入,RDelayedQueue 基于 ZSet + Lua 实现可靠延迟投递。

在 Spring Boot 中用 Redisson 实现分布式锁和延迟队列,核心是借助 Redisson 提供的 RLock 和 RDelayedQueue 接口,配合其自动重连、看门狗(Watchdog)续期、跨 JVM 一致性等能力。关键不是“自己封装”,而是正确初始化 RedissonClient,并按语义使用原生 API。
配置 RedissonClient Bean
Spring Boot 项目中需手动定义 RedissonClient Bean,不依赖 spring-boot-starter-data-redis 的默认连接。推荐使用 YAML 配置 + Config 编程式构建:
- 添加依赖:
org.redisson:redisson-spring-boot-starter(版本建议 3.24.x+,兼容 Spring Boot 2.7/3.x) - 在
application.yml中写入 Redis 连接信息(如单节点、哨兵或集群模式) - 编写
@Configuration类,读取配置生成Config,再创建RedissonClient
示例单机配置片段:
config.setTransportMode(TransportMode.NIO);config.useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword("pwd");
return Redisson.create(config);
用 RLock 实现可重入分布式锁
Redisson 的 RLock 默认支持自动续期(看门狗,默认 30 秒),避免业务执行超时导致误释放。加锁失败会阻塞(可设超时),成功后必须显式解锁(推荐 try-finally 或 try-with-resources)。
立即学习“Java免费学习笔记(深入)”;
- 获取锁:
RLock lock = redisson.getLock("order:lock:1001"); - 尝试加锁:
boolean isLocked = lock.tryLock(3, 10, TimeUnit.SECONDS);—— 等待最多 3 秒,持有锁 10 秒(若未关闭看门狗,则实际由看门狗续期) - 释放锁:
if (isLocked) lock.unlock();;若担心锁被他人释放,可用lock.forceUnlock()强制清除(慎用) - 注意:不要在异步线程中 unlock,锁绑定当前线程;如需跨线程控制,改用
RLock.lockAsync()+RFuture
用 RDelayedQueue 实现可靠延迟队列
Redisson 的延迟队列基于 Redis 的有序集合(ZSet)+ Lua 脚本实现,无外部依赖。本质是把任务对象先放入一个 RDelayedQueue,到期后自动转入关联的 RQueue,由消费者轮询处理。
- 声明两个队列:
RQueue<task> queue = redisson.getQueue("task:ready");</task>和RDelayedQueue<task> delayed = redisson.getDelayedQueue(queue);</task> - 投递延迟任务:
delayed.offer(task, 5, TimeUnit.SECONDS);—— 5 秒后进入queue - 消费端持续调用
queue.poll()即可获取到期任务(建议用queue.poll(1, TimeUnit.SECONDS)避免忙等) - 注意:Task 必须可序列化(实现
Serializable),且类名不能变更,否则反序列化失败;生产环境建议用 JSON 字符串封装任务,更灵活
常见陷阱与加固建议
实际落地时容易忽略几个关键点:
- 锁粒度要合理:避免“全局锁”,优先按业务 ID(如用户 ID、订单号)分片加锁
- 延迟任务不要存大对象:RDelayedQueue 底层走 Redis,单个 value 建议
- RedissonClient 必须单例复用:不可每次 new,否则 Watchdog 失效、连接爆炸
- 异常场景兜底:网络抖动可能导致 unlock 失败,可在业务层记录锁申请日志 + 设置最大持有时间(如数据库字段标记“处理中”,定时扫描超时任务)
- Spring AOP 自动加锁?不推荐直接代理方法——Redisson 锁非 Spring 事务资源,无法集成到 @Transactional 生命周期,应显式编码控制


















