当前位置: 首页 > news >正文

基于Redis Zset 实现延迟队列

延迟队列是一种消息队列的变体,允许消息在指定的时间后才会被消费者处理。基于 Redis 的 有序集合(Zset) 是实现延迟队列最简单、高效的方案之一。其核心原理是利用 Zset 的 score 字段存储消息的执行时间戳,消费者通过轮询获取 score <= 当前时间 的消息进行处理。


一、核心原理

1.1 数据结构定义

数据结构作用字段说明
Zset(延迟队列)存储延迟消息member = 消息体(JSON),score = 执行时间戳
Hash(消息详情)存储消息完整内容(可选)当消息体较大时,Zset 仅存储消息 ID

1.2 工作流程

二、完整代码实现

2.1 消息实体定义

java

@Data @Builder @NoArgsConstructor @AllArgsConstructor public class DelayMessage<T> { /** * 消息唯一ID(用于幂等和重试) */ private String id; /** * 消息体(业务数据) */ private T data; /** * 延迟时间(毫秒) */ private Long delayMillis; /** * 执行时间戳(毫秒) */ private Long executeTime; /** * 创建时间 */ private Long createTime; /** * 重试次数 */ private Integer retryCount; /** * 最大重试次数 */ private Integer maxRetryCount; /** * 消息业务类型 */ private String topic; public String toJson() { return JSON.toJSONString(this); } public static <T> DelayMessage<T> fromJson(String json, Class<T> dataClass) { return JSON.parseObject(json, new TypeReference<DelayMessage<T>>() {}); } }

2.2 延迟队列实现类

java

@Component @Slf4j public class RedisDelayQueue { @Autowired private StringRedisTemplate redisTemplate; private static final String QUEUE_KEY_PREFIX = "delay_queue:"; /** * 添加延迟消息 * @param queueName 队列名称(用于区分不同业务) * @param message 消息体 * @param delayMillis 延迟时间(毫秒) */ public <T> void addMessage(String queueName, T message, long delayMillis) { String queueKey = QUEUE_KEY_PREFIX + queueName; String messageId = UUID.randomUUID().toString(); long executeTime = System.currentTimeMillis() + delayMillis; DelayMessage<T> delayMsg = DelayMessage.<T>builder() .id(messageId) .data(message) .delayMillis(d
http://www.jsqmd.com/news/723980/

相关文章:

  • 2026年钢铁槽钢公司Top10,探讨永洋钢铁槽钢有实力吗 - 工业设备
  • 目标检测YOLOv5前,别忘了用OpenCV给图像做个‘光照SPA’:预处理实战
  • 2026年内蒙古靠谱的玻璃钢化粪池定制厂家排名Top10 - 工业设备
  • 告别纸上谈兵:用Vector Davinci Configurator手把手配置Autosar DCM模块(实战避坑)
  • 深度学习篇---匈牙利算法与OC-SORT
  • 2026年北京口碑好的AI全域全网搜索服务公司推荐,专业解决方案全解析 - 工业品牌热点
  • 3分钟免费解密网易云音乐NCM文件:ncmdump完整使用指南
  • GitHub中文界面终极汉化指南:3分钟告别英文困扰,提升30%开发效率
  • DLSS Swapper完全指南:3分钟免费提升游戏画质与性能的终极方案
  • 57-0000-13 X 射线管 10KV,1.5mA,15 W,Fe 靶
  • 超越基础教程:用VPI+Matlab实现高阶QAM相干光通信系统的DSP算法实战
  • NVMe 2.3协议学习
  • 详解C++编程中数组的基本用法
  • 3个关键技术方案解决抖音直播实时数据采集难题
  • 聊聊2026年浙江梯形华夫板选购,实力厂商全分析 - 工业设备
  • 手把手教你用Python调参:让LSTM和ARIMA在时间序列预测里“各司其职”(基于PyTorch和pmdarima)
  • XUnity.AutoTranslator完整教程:3步实现Unity游戏实时翻译
  • C++实现String类的方法详解
  • 技术访问者的操作扩展与元素分离
  • 爬虫进阶:用Playwright拦截并分析动态页面请求,精准获取数据源
  • 测试说明文章
  • 【2026最新收藏版】AI Agent详解:从入门到实战,小白程序员必看的大模型智能体学习指南
  • 2026年佛山地区裁断机选购指南,裁断机定制生产的品牌推荐 - 工业设备
  • LeetCode 接雨水:python 题解
  • 如何为Windows系统安装macOS风格鼠标指针:完整配置指南
  • 支付宝上线AI付,让众多“龙虾”实现收钱,详细开通步骤
  • 聊聊2026年浙江性价比高的不锈钢雕塑来图定制企业,哪家值得选 - 工业推荐榜
  • MAUI 嵌入式 Web 架构实战(一) 在 MAUI 应用中嵌入 PicoServer 构建本地 HTTP 服务
  • GitHub中文插件:3分钟实现GitHub界面全面汉化
  • 3分钟掌握ncmdump:网易云音乐NCM文件终极转换指南