• Redisson实现延迟队列


    延迟队列是指在队列中存储带有过期时间的数据,在过期时间到达时自动从队列中移除。

    延时队列的使用场景:

    • 订单超过15分钟未支付自动取消
    • 推送数据至第三方平台,如果失败重新入队推送,推送间隔时间随着失败次数增加而扩大。
    • 分布式情况下一个定时任务往队列内推,多个实例同时处理任务。

    Redisson实现的延迟队列是基于Redis的zset命令实现的,通过将数据存储到zset中,并设置过期时间作为score,通过定时任务轮询zset来实现延迟队列的功能。

    以下提供一个 RedisDelayQueueUtil 来简化操作。

    @Slf4j
    @Component
    public class RedisDelayQueueUtil implements ApplicationContextAware {
    
        private static RedissonClient redissonClient;
    
        /**
         * 添加延迟队列
         * @param value 队列值
         * @param delay 延迟时间
         * @param timeUnit 时间单位
         * @param queueCode 队列键
         * @param 
         */
        public static <T> void addDelayQueue(T value, long delay, TimeUnit timeUnit, String queueCode){
            try {
                RBlockingDeque<Object> blockingDeque = redissonClient.getBlockingDeque(queueCode);
                RDelayedQueue<Object> delayedQueue = redissonClient.getDelayedQueue(blockingDeque);
                delayedQueue.offer(value, delay, timeUnit);
                log.info("Redisson添加延时队列成功 队列键:{},队列值:{},延迟时间:{}", queueCode, value, timeUnit.toSeconds(delay) + "秒");
            } catch (Exception e) {
                log.error("Redisson添加延时队列失败 {}", e.getMessage());
                throw new RuntimeException("Redisson添加延时队列失败");
            }
        }
    
        /**
         * 获取延迟队列 - 会阻塞
         * @param queueCode 队列名称
         * @return   数据
         * @throws InterruptedException
         */
        public static <T> T getDelayQueue(String queueCode) throws InterruptedException {
            RBlockingDeque<T> blockingDeque = redissonClient.getBlockingDeque(queueCode);
            return blockingDeque.take();
        }
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            RedisDelayQueueUtil.redissonClient = applicationContext.getBean(RedissonClient.class);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
  • 相关阅读:
    实战|轻松用 Python 开发一个简单有趣的聊天小程序
    Rasa 3.x 学习系列-Rasa 3.2.0 新版本发布
    Loop Copilot:AI驱动,小白也能自己生成音乐?
    Java的五大引用
    1V1音视频实时互动直播系统
    人工智能+
    使用 TensorFlow.js 在浏览器中进行自定义对象检测
    【Linux】基本指令 (下篇)
    记录linux清理空间的步骤
    诠释韧性增长,知乎Q3财报里的社区优势和商业化价值
  • 原文地址:https://blog.csdn.net/dndndnnffj/article/details/134258838