基于redis完成延迟队列

添加依赖

使用redisson完成延迟队列效果

复制代码
        <!-- redisson依赖 -->
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.17.4</version> <!-- 请使用最新版本 -->
        </dependency>

添加配置类

复制代码
@Configuration
public class MyRedissonConfig {
 /**
  * 所有对Redisson的使用都是通过RedissonClient对象
  * @return
  */
 @Bean(destroyMethod = "shutdown")
 public RedissonClient redissonClient(){
  // 创建配置 指定redis地址及节点信息
  Config config = new Config();
  config.useSingleServer().setAddress("redis://ip:port");

  // 根据config创建出RedissonClient实例
  RedissonClient redissonClient = Redisson.create(config);
  return redissonClient;
 }

}

简单使用

新增常量类 ShoppingConstants

复制代码
public class ShoppingConstants {



 /**
  * 商品延迟队列
  */
 public static final String REDISSON_DELAY1 = "redisson_delay1";



}

业务代码

复制代码
    @Autowired
    private RedissonClient redissonClient;


            //创建延迟队列
            RBlockingDeque<String> blockingDeque = redissonClient.getBlockingDeque(ShoppingConstants.REDISSON_DELAY1);
            //把阻塞队列(对应redis List结构)和延迟队列(对应redis ZSet结构)进行关系绑定
            RDelayedQueue<String> rDelayedQueue = redissonClient.getDelayedQueue(blockingDeque);
            //延迟队列工作原理:延迟队列里面消息到期后 会把消息从延迟队列中移除 并放入阻塞队列
            //存入数据
            rDelayedQueue.offer(order.toJsonString(),10, TimeUnit.SECONDS);


            //消费队列  此代码会阻塞线程直到获取到数据才会往下执行
            String take = blockingQueue.take();

进阶使用(延迟队列效果)

生产者

复制代码
    //创建延迟队列
            RBlockingDeque<String> blockingDeque = redissonClient.getBlockingDeque(ShoppingConstants.REDISSON_DELAY1);
            //把阻塞队列(对应redis List结构)和延迟队列(对应redis ZSet结构)进行关系绑定
            RDelayedQueue<String> rDelayedQueue = redissonClient.getDelayedQueue(blockingDeque);
            //延迟队列工作原理:延迟队列里面消息到期后 会把消息从延迟队列中移除 并放入阻塞队列
            //存入数据
            rDelayedQueue.offer(order.toJsonString(),10, TimeUnit.SECONDS);

消费者

复制代码
@Configuration
public class RedissonDelayOrder {

    @Autowired
    private RedissonClient redissonClient;


    //监听线程
    private Thread listenerThread;

    //是否循环
    private volatile boolean running = true;

    Logger logger = LoggerFactory.getLogger(RedissonDelayOrder.class);

    @PostConstruct
    public void listener() throws Exception {

        //如果在主线程做阻塞操作,可能导致spring无法初始化其他任务
        listenerThread = new Thread(() -> {
            while (running) {
                try {

                    //获取延迟队列
                    RBlockingQueue<String> blockingQueue = redissonClient.getBlockingQueue(ShoppingConstants.REDISSON_DELAY1);
                    //消费队列
                    String take = blockingQueue.take();

                    //获取到数据
                    if (take != null){

                        logger.info("redisson的延迟队列消费者获取到的消息:{}",take);

                    }


                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt(); // 重新设置中断状态
                    throw new RuntimeException("订单取消监听线程中断", e);
                }
            }
        });

        listenerThread.start();

    }


    @PreDestroy
    public void stopListener() {
        running = false;
        if (listenerThread != null) {
            listenerThread.interrupt();
            try {
                listenerThread.join(5000); // 等待最多5秒让线程结束
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                logger.error("等待监听线程结束时被中断", e);
            }
        }
    }
}

测试

下单后十秒钟未支付释放库存效果

相关推荐
TDengine (老段)4 小时前
TDengine 数学函数 DEGRESS 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine
TDengine (老段)4 小时前
TDengine 数学函数 GREATEST 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
RoboWizard4 小时前
扩容刚需 金士顿新款Canvas Plus存储卡
java·spring·缓存·电脑·金士顿
安当加密4 小时前
云原生时代的数据库字段加密:在微服务与 Kubernetes 中实现合规与敏捷的统一
数据库·微服务·云原生
爱喝白开水a4 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
想ai抽4 小时前
深入starrocks-多列联合统计一致性探查与策略(YY一下)
java·数据库·数据仓库
武子康4 小时前
Java-152 深入浅出 MongoDB 索引详解 从 MongoDB B-树 到 MySQL B+树 索引机制、数据结构与应用场景的全面对比分析
java·开发语言·数据库·sql·mongodb·性能优化·nosql
longgyy5 小时前
5 分钟用火山引擎 DeepSeek 调用大模型生成小红书文案
java·数据库·火山引擎
学无止境w5 小时前
高并发系统架构设计原则:无状态、水平扩展、异步化、缓存优先
缓存·系统架构
ytttr8735 小时前
C# 仿QQ聊天功能实现 (SQL Server数据库)
数据库·oracle·c#