【分布式系列】基于Redisson的延迟队列的实现方案

Java实现

public class RedissonTest {

    private static RedissonClient redissonClient;

    static {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
        redissonClient = Redisson.create(config);
    }

    public static void main(String[] args) throws InterruptedException {
        // redisson  延迟队列
        // Redisson的延时队列是对另一个队列的再包装,使用时要先将延时消息添加到延时队列中,
        // 当延时队列中的消息达到设定的延时时间后,该延时消息才会进行进入到被包装队列中,因此,我们只需要对被包装队列进行监听即可。
        RBlockingQueue<String> blockingFairQueue = redissonClient.getBlockingQueue("my-test");

        RDelayedQueue<String> delayedQueue = redissonClient.getDelayedQueue(blockingFairQueue);

        String message = "hello charles" + LocalDateTime.now();
        // 60秒钟以后将消息发送到指定队列
        delayedQueue.offer(message, 60, TimeUnit.SECONDS);
        RBlockingQueue<String> outQueue = redissonClient.getBlockingQueue("my-test");

        String orderInfo2 = outQueue.take();
        System.out.println("订单生成时间" + orderInfo2);
        System.out.println("订单关闭时间" + LocalDateTime.now());

        // 在该对象不再需要的情况下,应该主动销毁。仅在相关的Redisson对象也需要关闭的时候可以不用主动销毁
        delayedQueue.destroy();

        return orderInfo2;
    }

实现原理

redisson基于RBlockingQueue 目标队列在进行消费,RDelayedQueue就是会把过期的消息放入到我们的目标队列中,

redisson只要从RBlockingQueue队列中取数据即可。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值