欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > 基于redis完成延迟队列

基于redis完成延迟队列

2025/4/18 10:58:40 来源:https://blog.csdn.net/Diyu0904/article/details/143812055  浏览:    关键词:基于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";}

业务代码 

    @Autowiredprivate 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 {@Autowiredprivate RedissonClient redissonClient;//监听线程private Thread listenerThread;//是否循环private volatile boolean running = true;Logger logger = LoggerFactory.getLogger(RedissonDelayOrder.class);@PostConstructpublic 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();}@PreDestroypublic void stopListener() {running = false;if (listenerThread != null) {listenerThread.interrupt();try {listenerThread.join(5000); // 等待最多5秒让线程结束} catch (InterruptedException e) {Thread.currentThread().interrupt();logger.error("等待监听线程结束时被中断", e);}}}
}

测试

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词