ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

redis实现定期关单

redis实现定期关单
在SpringBoot项目中,实现订单超过24小时过期并自动关单,常见有以下几种方案,我会逐一说明,并给出推荐实现:

✅ 推荐方案:使用 延迟队列(DelayQueue) 或 消息队列(如RabbitMQ延迟消息)

方案1:使用 Redis + 延迟队列(Redisson延迟队列)

优点: 高性能、易扩展、适合分布式系统
实现步骤:
  1. 引入Redisson依赖:
xml
复制
<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.4</version>
</dependency>
 
  1. 下单时,将订单ID加入延迟队列,延迟时间为24小时:
java
复制
RDelayedQueue<String> delayedQueue = redissonClient.getDelayedQueue("orderDelayQueue");
delayedQueue.offer(orderId, 24, TimeUnit.HOURS);
 
  1. 启动一个监听线程,消费延迟队列:
java
复制
RQueue<String> queue = redissonClient.getQueue("orderDelayQueue");
RDelayedQueue<String> delayedQueue = redissonClient.getDelayedQueue(queue);new Thread(() -> {while (true) {try {String orderId = queue.take(); // 阻塞等待过期订单// 查询订单状态,如果未支付,则关单Order order = orderService.getById(orderId);if (order != null && "UNPAID".equals(order.getStatus())) {orderService.closeOrder(orderId);log.info("订单已关闭:{}", orderId);}} catch (InterruptedException e) {Thread.currentThread().interrupt();break;}}
}).start();
返回列表