Redis 实现延迟任务的三种常见方法分别是基于 有序集合(ZSet)、过期 Key 通知 和 Redisson 延迟队列。以下为详细解析:
![图片[1]_Redis 延迟任务:从基础到进阶的三种实现路径》_知途无界](https://zhituwujie.com/wp-content/uploads/2025/04/d2b5ca33bd20250411104223.png)
方法一:基于有序集合(ZSet)实现延迟任务
核心原理
Redis 的有序集合(ZSet)通过 score 字段对元素排序,可利用时间戳作为 score,按时间顺序存储任务。定时任务轮询检查 score 小于等于当前时间的任务,并执行。
实现步骤
- 添加任务
- 将任务的时间戳作为
score,任务描述作为value,存入 ZSet。 - 示例命令:
shell复制代码ZADD delay_queue <timestamp> <task_id>
- 将任务的时间戳作为
- 轮询执行
- 定时任务通过
ZRANGEBYSCORE获取到期任务:shell复制代码ZRANGEBYSCORE delay_queue 0 <current_timestamp> - 执行任务后,从 ZSet 中删除:
shell复制代码ZREM delay_queue <task_id>
- 定时任务通过
特点
- 优点:简单高效,支持任务动态调整(通过修改
score)。 - 缺点:依赖定时任务轮询,可能存在精度误差。
方法二:基于过期 Key 通知实现延迟任务
核心原理
Redis 提供键空间通知(Keyspace Notifications),当 Key 过期时,会触发事件通知。通过监听过期事件,可实现延迟任务。
实现步骤
- 开启过期通知
- 修改 Redis 配置文件或动态设置:
shell复制代码CONFIG SET notify-keyspace-events Ex
- 修改 Redis 配置文件或动态设置:
- 设置任务 Key
- 为任务设置过期时间,Key 名称可包含任务标识:
shell复制代码SETEX task_key:<task_id> <delay_seconds> <task_data>
- 为任务设置过期时间,Key 名称可包含任务标识:
- 监听过期事件
- 订阅过期事件频道(如
__keyevent@0__:expired),获取过期 Key 并执行任务。
- 订阅过期事件频道(如
特点
- 优点:无需轮询,任务触发精准。
- 缺点:依赖 Redis 配置,需额外处理 Key 命名冲突。
方法三:基于 Redisson 延迟队列实现延迟任务
核心原理
Redisson 是 Redis 的 Java 客户端,提供 RDelayedQueue 实现延迟队列,底层基于 ZSet。
实现步骤
- 添加依赖
- 在
pom.xml中引入 Redisson 依赖:xml复制代码<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.16.3</version></dependency>
- 在
- 配置 Redisson 客户端
- 创建 Redisson 客户端实例:
java复制代码Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");RedissonClient redisson = Redisson.create(config);
- 创建 Redisson 客户端实例:
- 创建延迟队列
- 使用
RDelayedQueue和RQueue组合:java复制代码RQueue<String> queue = redisson.getQueue("taskQueue");RDelayedQueue<String> delayedQueue = redisson.getDelayedQueue(queue);delayedQueue.offer("task1", 5, TimeUnit.SECONDS);
- 使用
特点
- 优点:封装完善,支持高并发,减少开发复杂度。
- 缺点:依赖 Redisson 客户端,灵活性略低。
总结对比
| 方法 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
| 有序集合(ZSet) | 简单高效,支持动态调整 | 依赖轮询,精度有限 | 轻量级延迟任务 |
| 过期 Key 通知 | 触发精准,无需轮询 | 依赖 Redis 配置,扩展性弱 | 高精度、低并发任务 |
| Redisson 延迟队列 | 封装完善,支持高并发 | 依赖客户端,灵活性略低 | 企业级延迟任务 |
根据业务需求选择合适方案,可结合多种方法实现更复杂的延迟任务场景。
© 版权声明
文中内容均来源于公开资料,受限于信息的时效性和复杂性,可能存在误差或遗漏。我们已尽力确保内容的准确性,但对于因信息变更或错误导致的任何后果,本站不承担任何责任。如需引用本文内容,请注明出处并尊重原作者的版权。
THE END

























暂无评论内容