基于Redis的延时队列

之前有一篇文件讲到延时队列,用的是jdk的 DelayQueue实现的。

使用jdk的DelayQueue实现的缺点: 1.基于应用内存,重启或宕机后数据会丢失 2. 如果要集群,不好扩展

此处基于redis做一个可用性较高的延时队列。

Redisson中有延时队列的实现,可以直接拿来用

@Controller
@RequestMapping("order")
public class OrderController extends BaseController {

    /**
     * 下订单
     */
    @PostMapping()
    @ResponseBody
    public WSResponseVO doOrder(){
        //调用生成订单逻辑,并返回订单id
        String orderId = UUID.randomUUID().toString();
       RBlockingQueue<RedPacketMessage> blockingRedPacketQueue
                = redissonClient.getBlockingQueue("orderDelayQueue");
    
        RDelayedQueue<RedPacketMessage> delayedQueue
                = redissonClient.getDelayedQueue(blockingRedPacketQueue);

        
        //订单延时进入队列.延迟3秒后失效
        delayedQueue.offer(new MyDelayMessage("001A"), 3, TimeUnit.SECONDS);
    }

}

对于从队列中取元素消费跟使用jdk的差不多,只是队列要从redis中获取。其获取元素的API也是take().此处省略代码

发布了53 篇原创文章 · 获赞 5 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_40085888/article/details/104346689