java
标准化、规范化
java代码风格
【目录】java
编程-java8
编程-java9
编程-java-见过的异常
gradle
编程-java21
编程-java23
编程-java17
编程-java11
【目录】java-web-其它框架
java-vertx
quarkus
javalin
solon
Helidon
【目录】spring家族
spring
springcloud + nacos
consul
springboot启动流程
springboot使用及原理
springcloud
优化springboot
【java高级】
java-多线程-问题记录
java高级-ArrayList
java高级-HashMap
jdk源码解析-TreeMap红黑树
java对象占用多少字节
juc(并发)
ThreadPoolExecutor中ctl变量的理解
ThreadPoolExecutor分析
JVM(java虚拟机)
jvm学习路线
jvm
Java启动参数
debug
java-debug-arthas
java-debug-jdb
高并发/高性能/高可用
设计代码或编写代码时应该考虑的
如何发现系统中的瓶颈?
场景分析
订单超时关闭的实现
灰度发布
mysql
mysql explain
mysql主从
mysql常见异常
方法论
工作中遇到的问题记录
代码优化
学习的思路
产品
archunit
postgresql
postgresql-beginner
根据mysql表生成pgsql建表语句
中间件
RabbitMQ
本文档使用 MrDoc 发布
-
+
首页
订单超时关闭的实现
使用redis zset + mq实现。 其实这个方案就是长延迟用 Redis,短延迟用 RocketMQ,既保证了高精度触发,又突破了 RocketMQ 延迟等级的限制。 ## **实现思路** 1. **下单时** - 把订单 ID 和到期时间(`orderExpireTime`)存到 Redis 的 ZSet,score 就是到期时间的时间戳(毫秒)。 2. **定时扫描 Redis** - 每隔一段时间(比如 1 分钟)扫描 `score <= 当前时间` 的订单 ID。 - 把这些订单 ID 从 ZSet 删除。 - 发 RocketMQ 延迟消息(如果还需要短延迟,比如多等几秒做缓冲)。 3. **RocketMQ 消费者** - 收到消息执行订单关闭逻辑(更新订单状态、回滚库存等)。 4. **幂等处理** - 确保订单关闭是幂等的,避免重复执行。 Redis 数据结构 ```shell # ZSet key: order_timeout ZADD order_timeout 1734144000000 orderId_123 # score 是到期时间戳 ``` 下单时写入 Redis ```java public void saveOrderToRedis(String orderId, long expireMillis) { String key = "order_timeout"; long expireAt = System.currentTimeMillis() + expireMillis; // 过期时间戳 redisTemplate.opsForZSet().add(key, orderId, expireAt); } ``` 定时任务扫描到期订单并发 MQ 消息 ```java @Scheduled(fixedRate = 60000) // 每分钟扫描一次 public void scanAndSendToMQ() { String key = "order_timeout"; long now = System.currentTimeMillis(); Set<String> dueOrders = redisTemplate.opsForZSet().rangeByScore(key, 0, now); if (dueOrders != null && !dueOrders.isEmpty()) { // 删除这些订单 redisTemplate.opsForZSet().remove(key, dueOrders.toArray()); // 发到 RocketMQ 让消费者执行关闭 for (String orderId : dueOrders) { sendCloseOrderMQ(orderId); } } } ``` ### 优化点 扫描频率:可以按分钟、5分钟等频率调整,看业务精度需求 批量发送:到期订单多时,批量发 MQ 消息 高可用:定时任务用分布式任务调度(如 XXL-JOB、Quartz 集群模式) 防重:订单关闭时先判断状态是否已关闭
我是张三
2025年8月13日 15:03
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
eblog
Markdown文件
分享
链接
类型
密码
更新密码