美文网首页
延时任务处理

延时任务处理

作者: M_lear | 来源:发表于2024-06-25 14:41 被阅读0次

    使用Redisson提供的RDelayedQueue接口。
    好处:

    1. 性能好,基于redis。
    2. 支持分布式服务。
    3. 不需要轮询。

    RedissonDelayedQueue

    添加延时任务

    // 获取阻塞队列实例
    RBlockingQueue<String> blockingQueue = redisson.getBlockingQueue("myQueue");
    // 创建延时队列,关联到阻塞队列
    RDelayedQueue<String> delayedQueue = redisson.getDelayedQueue(blockingQueue);
    
    // 向延时队列中添加元素,10秒后过期
    delayedQueue.offer("item1", 10, TimeUnit.SECONDS);
    

    消费延时任务

    // 获取阻塞队列实例
    RBlockingQueue<String> blockingQueue = redisson.getBlockingQueue("myQueue");
    
    // 从阻塞队列中取出元素
    try {
        String item = blockingQueue.take();  // 阻塞直到元素可用
        System.out.println("取出元素: " + item);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    

    添加延时任务的过程:
    把延时任务添加到zset。
    本地调度一个和zset队首过期时间保持一致的定时任务。
    定时任务到期执行时,会把zset队首的过期任务转移到list。

    消费延时任务的过程:
    使用list的阻塞式读取命令BLPOP,获取已到期的延时任务。


    为了保证调度的定时任务其执行时间和zset队首延时任务的到期时间一致,做了两点:

    1. 在offer延时任务时,检查新offer的延时任务是不是在队首,如果是,则通过redis的发布订阅触发重新调度定时任务。
    2. 在定时任务执行时,把队首最多100个到期的延时任务转移到list后,只要zset不空,就按队首延时任务的到期时间调度下次定时任务。

    相关阅读:

    1. Redisson分布式延时队列 RedissonDelayedQueue
    2. 基于redis,redisson的延迟队列实践

    相关文章

      网友评论

          本文标题:延时任务处理

          本文链接:https://www.haomeiwen.com/subject/nbcjcjtx.html