Redisson 实现消息队列、延迟队列 (生产可用)

前言

之前使用redis实现了消息队列,但是没有延迟消费的功能,现在编写一个可以实现延迟消费的功能,同时也能满足及时消费,只需要将延迟时间设置0就行了,用到了Redission,不需要基于stream进行一些复杂配置。

原理概述

Redisson 将任务按照预定的执行时间存储在 zset 中,任务的执行时间作为 score,任务本身序列化后的数据作为 member。同时,Redisson 会在后台持续监控这个 ZSET,一旦发现有符合执行条件(当前时间 >= score)的任务,就会自动将这些任务转移到另一个 RQueue(Redisson 的队列实现)中,应用程序只需要从 RQueue 中取出任务执行即可。

参考文章

【redis缓存】怎么使用 Redis 实现一个延时队列?_redis实现延时队列-CSDN博客

Redisson 的延迟队列真的能用吗?一文看透原理 + 坑点_redission延时队列原理-CSDN博客

Spring Boot 集成 Redisson 实现消息队列_springboot redis消息队列-CSDN博客

【使用redisson完成延迟队列的功能】使用redisson配合线程池完成异步执行功能,延迟队列和不需要延迟的队列_redisson延时阻塞队列-CSDN博客


引入相关依赖

         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.7.18</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.7.18</version>
        </dependency>

        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson-spring-boot-starter</artifactId>
            <version>3.23.3</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
            <version>2.13.5</version>
        </dependency>

配置文件

server:
  port: ${SERVER_PORT:9211}

# Spring
spring:
  application:
    # 应用名称
    name: ruoyi-redis-msg
  redis:
    host: localhost
    port: 6379
    password: 123456
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher

# redission延迟队列相关配置
redission:
  delayqueue:
    enable: true  # 是否启用
    # handler线程池配置
    # 当任务数≤corePoolSize时:所有任务由核心线程直接执行
    # 当corePoolSize<任务数≤blockingQueueNum+corePoolSize时:
    #   前corePoolSize个任务由核心线程执行 剩余任务会触发线程扩容(最多到maximumPoolSize个线程),后面的任务进入队列等待
    # 当任务数>blockingQueueNum+corePoolSize时:将触发拒绝策略(默认是AbortPolicy)
    handlerConfig:
      corePoolSize: 5              # 核心线程数:线程池中保持活跃的最小线程数,即使它们处于空闲状态
      maximumPoolSize: 10          # 最大线程数: 线程池允许创建的最大线程数
      keepAliveTime: 30            # 空闲线程存活时间:当线程数超过核心线程数时,多余的空闲线程在终止前等待新任务的最长时间
      blockingQueueNum: 1000       # 队列的最大容量为1000个任务当队列已满时,新提交的任务会被阻塞(取决于线程池的拒绝策略)
    deadLine: dead_line            # 死信队列名前缀
    queueThreads: 1                # 监听队列的线程数,不宜设置过大,范围建议1-5
    queueConfigs:
      - queueName: goodsDelayQueue        # 延迟队列名 Redis Key
        beanId: goodsDelayConsumeHandler  # 延迟队列具体业务实现的Bean,可通过Spring的上下文获取
        desc: 商品消费的延迟队列            # 延迟队列名描述
      - queueName: orderDelayQueue
        beanId: orderDelayConsumeHandler
        desc: 订单消费的延迟队列
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.List;

@Configuration
@ConfigurationProperties(prefix = "redission.delayqueue")
@Slf4j
@Data
public class RedisDelayQueueConfigProperties {
    private List<QueueConfig> queueConfigs;
    private HandlerConfig handlerConfig;
    private String deadLine;
    private int queueThreads;

    @Data
    public static class QueueConfig {
        private String queueName;
        private String desc;
        private String beanId;
    }

    @Data
    public static class HandlerConfig {
        private int corePoolSize;
        private int maximumPoolSize;
        private long keepAliveTime;
        private int blockingQueueNum;
    }
}

redission配置类

    
                    
    评论 1
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值