SpringBoot怎么集成Redisson实现延迟队列
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,今天小编给大家分享一下SpringBoot怎么集成Redisson实现延迟队列的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文
千家信息网最后更新 2025年12月03日SpringBoot怎么集成Redisson实现延迟队列
今天小编给大家分享一下SpringBoot怎么集成Redisson实现延迟队列的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
使用场景
1、下单成功,30分钟未支付。支付超时,自动取消订单
2、订单签收,签收后7天未进行评价。订单超时未评价,系统默认好评
3、下单成功,商家5分钟未接单,订单取消
4、配送超时,推送短信提醒
……
对于延时比较长的场景、实时性不高的场景,我们可以采用任务调度的方式定时轮询处理。如:xxl-job
今天我们采用一种比较简单、轻量级的方式,使用 Redis 的延迟队列来进行处理。当然有更好的解决方案,可根据公司的技术选型和业务体系选择最优方案。如:使用消息中间件Kafka、RabbitMQ 的延迟队列
先不讨论其实现原理,直接实战上代码先实现基于 Redis 的延迟队列
1、引入 Redisson 依赖
org.redisson redisson-spring-boot-starter 3.10.5
2、Nacos 配置 Redis 连接
spring: redis: host: 127.0.0.1 port: 6379 password: 123456 database: 12 timeout: 3000
3、创建 RedissonConfig 配置
/** * Created by LPB on 2020/04/20. */@Configurationpublic class RedissonConfig { @Value("${spring.redis.host}") private String host; @Value("${spring.redis.port}") private int port; @Value("${spring.redis.database}") private int database; @Value("${spring.redis.password}") private String password; @Bean public RedissonClient redissonClient() { Config config = new Config(); config.useSingleServer() .setAddress("redis://" + host + ":" + port) .setDatabase(database) .setPassword(password); return Redisson.create(config); }}4、封装 Redis 延迟队列工具类
/** * redis延迟队列工具 * Created by LPB on 2021/04/20. */@Slf4j@Componentpublic class RedisDelayQueueUtil { @Autowired private RedissonClient redissonClient; /** * 添加延迟队列 * @param value 队列值 * @param delay 延迟时间 * @param timeUnit 时间单位 * @param queueCode 队列键 * @param */ public void addDelayQueue(T value, long delay, TimeUnit timeUnit, String queueCode){ try { RBlockingDeque 5、创建延迟队列业务枚举
/** * 延迟队列业务枚举 * Created by LPB on 2021/04/20. */@Getter@NoArgsConstructor@AllArgsConstructorpublic enum RedisDelayQueueEnum { ORDER_PAYMENT_TIMEOUT("ORDER_PAYMENT_TIMEOUT","订单支付超时,自动取消订单", "orderPaymentTimeout"), ORDER_TIMEOUT_NOT_EVALUATED("ORDER_TIMEOUT_NOT_EVALUATED", "订单超时未评价,系统默认好评", "orderTimeoutNotEvaluated"); /** * 延迟队列 Redis Key */ private String code; /** * 中文描述 */ private String name; /** * 延迟队列具体业务实现的 Bean * 可通过 Spring 的上下文获取 */ private String beanId;}6、定义延迟队列执行器
/** * 延迟队列执行器 * Created by LPB on 2021/04/20. */public interface RedisDelayQueueHandle{ void execute(T t);}
7、创建枚举中定义的Bean,并实现延迟队列执行器
OrderPaymentTimeout:订单支付超时延迟队列处理类
/** * 订单支付超时处理类 * Created by LPB on 2021/04/20. */@Component@Slf4jpublic class OrderPaymentTimeout implements RedisDelayQueueHandle
OrderTimeoutNotEvaluated:订单超时未评价延迟队列处理类
/** * 订单超时未评价处理类 * Created by LPB on 2021/04/20. */@Component@Slf4jpublic class OrderTimeoutNotEvaluated implements RedisDelayQueueHandle
8、创建延迟队列消费线程,项目启动完成后开启
/** * 启动延迟队列 * Created by LPB on 2021/04/20. */@Slf4j@Componentpublic class RedisDelayQueueRunner implements CommandLineRunner { @Autowired private RedisDelayQueueUtil redisDelayQueueUtil; @Override public void run(String... args) { new Thread(() -> { while (true){ try { RedisDelayQueueEnum[] queueEnums = RedisDelayQueueEnum.values(); for (RedisDelayQueueEnum queueEnum : queueEnums) { Object value = redisDelayQueueUtil.getDelayQueue(queueEnum.getCode()); if (value != null) { RedisDelayQueueHandle redisDelayQueueHandle = SpringUtil.getBean(queueEnum.getBeanId()); redisDelayQueueHandle.execute(value); } } } catch (InterruptedException e) { log.error("(Redis延迟队列异常中断) {}", e.getMessage()); } } }).start(); log.info("(Redis延迟队列启动成功)"); }}以上步骤,Redis 延迟队列核心代码已经完成,下面我们写一个测试接口,用 PostMan 模拟测试一下
9、创建一个测试接口,模拟添加延迟队列
/** * 延迟队列测试 * Created by LPB on 2020/04/20. */@RestControllerpublic class RedisDelayQueueController { @Autowired private RedisDelayQueueUtil redisDelayQueueUtil; @PostMapping("/addQueue") public void addQueue() { Map map1 = new HashMap<>(); map1.put("orderId", "100"); map1.put("remark", "订单支付超时,自动取消订单"); Map map2 = new HashMap<>(); map2.put("orderId", "200"); map2.put("remark", "订单超时未评价,系统默认好评"); // 添加订单支付超时,自动取消订单延迟队列。为了测试效果,延迟10秒钟 redisDelayQueueUtil.addDelayQueue(map1, 10, TimeUnit.SECONDS, RedisDelayQueueEnum.ORDER_PAYMENT_TIMEOUT.getCode()); // 订单超时未评价,系统默认好评。为了测试效果,延迟20秒钟 redisDelayQueueUtil.addDelayQueue(map2, 20, TimeUnit.SECONDS, RedisDelayQueueEnum.ORDER_TIMEOUT_NOT_EVALUATED.getCode()); }} 10、启动 SpringBoot 项目,用 PostMan 调用接口添加延迟队列
通过 Redis 客户端可看到两个延迟队列已添加成功
查看 IDEA 控制台日志可看到延迟队列已消费成功
以上就是"SpringBoot怎么集成Redisson实现延迟队列"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。
队列
延迟
订单
支付
评价
处理
成功
业务
测试
好评
系统
知识
篇文章
场景
接口
时间
消息
执行器
内容
工具
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
神奇宝贝服务器刷
金山区市场软件开发品质保障
HIS服务器的管理
tp5 数据库 更新 关联
软件开发过程模型有哪些
职业测评系统软件开发
句容招工软件开发
我的世界服务器怎么建起床地图
天府新区人民医院网络安全
网络技术专业的高技学校
浏览器ip地址访问服务器
神奇宝贝服务器诅咒暴飞龙
网络安全模式要等多久
网络安全对学生管理
数据库是( ).
数据库自定义报表
网络安全法属于特别法
网络安全学术报告厅
软件开发属于哪个领域
hbn数据库是什么
交易平台数据库设计范例
传感器网络技术研究中心
我们如何保护网络安全英语
字节跳动服务器硬盘颗粒
南昌网络安全招聘
网络安全综合实践活动
什么app能连接远程服务器
游戏的数据库
苹果如何安装神奇宝贝服务器
金蝶k3数据库修复