【Redis】Redis结合SpringBoot实现延时队列

Spring Boot 整合——Redis延时队列的简单实现(基于有赞的设计) 设计 之前学习Redis的时候发现有赞团队之前分享过一篇关于延时队列的设计:https://tech.youzan.com/queuing_delay/, 现在就尝试实现一下 业务流程 首先我们分析下这个流程 用户提交任务。首先将任务推送至延迟队列中。 延迟队列接收到任务后,首先将任务推送至job pool中,然后计算其执行时间。 然后生成延迟任务(仅仅包含任务id)放入某个桶中 时间组件时刻轮... 阅读详情

1.场景

不知道各位开发者们在开发过程中有没有遇到过这样的场景,就是有一条数据进来了,要设置超时时间,比如我这里有一条待办的数据,48小时还未处理的话,这条数据要变成超时的状态,此时不光要修改状态,还要发信息通知他消息超时未处理。
此时,你有如下的解决思路:

  • 定时任务:每隔多长时间轮询一遍数据库,根据创建时间进行判断,超过48小时的进行处理,缺点显而易见,超时处理的不及时,时间设置的过短,可能上一次还没遍历完,下一次又开始了,时间设置过长,可能早就超时了,直到现在你才提醒用户超时

除此之外还有很多种,比如数据库写个触发器,通过MQ等等,但是这些都有很大的缺点。

2.Redis延时队列

2.1 引入依赖

   <dependency>
         <groupId>org.redisson</groupId>
         <artifactId>redisson</artifactId>
         <version>3.16.4</version>
   </dependency>

2.2 注入RedisClient

@Configuration
public class RedissonConfig {

    @Value("${spring.redis.host}")
    private String host;
    @Value("${spring.redis.port}")
    private String port;
    @Value("${spring.redis.password}")
    private String password;
    @Value("${spring.redis.database}")
    private Integer database;


    @Bean()
    public RedissonClient redissonClient() {
        Config config = new Config();
        SingleServerConfig serversConfig = config.useSingleServer();
        serversConfig.setAddress("redis://" + host + ":" + port);
        if (StringUtils.isNotEmpty(password)){
            serversConfig.setPassword(password);
        }
        serversConfig.setDatabase(database);
        return Redisson.create(config);
    }

}

3. 注入延时队列Bean

@Configuration
public class RedissonQueueConfig {

    private final String queueName = "queue";

    @Bean
    public RBlockingQueue<String> rBlockingQueue(RedissonClient redissonClient) {
        return redissonClient.getBlockingDeque(queueName);
    }

    @Bean(name = "rDelayedQueue")
    public RDelayedQueue<String> rDelayedQueue(RedissonClient redissonClient,
                                               @Qualifier("rBlockingQueue") RBlockingQueue<String> blockingQueue) {
        return redissonClient.getDelayedQueue(blockingQueue);
    }

}

4.编写方法

1.Service

public interface DelayQueue {

    public Boolean offer(Object object);

    public void offer(Object object, Long time, TimeUnit timeUnit);

    public void offerAsync(Object object, Long time, TimeUnit timeUnit);

    public Boolean offerAsync(Object object);

}

2.Service实现类

@Component
public class RedissionDelayQueue implements DelayQueue{

    @Resource(name = "rDelayedQueue")
    private RDelayedQueue<Object> rDelayedQueue;


    @Override
    public Boolean offer(Object object) {
        return rDelayedQueue.offer(object);
    }

    @Override
    public void offer(Object object, Long time, TimeUnit timeUnit) {
        rDelayedQueue.offer(object, time, timeUnit);
    }

    @Override
    public void offerAsync(Object object, Long time, TimeUnit timeUnit) {
        rDelayedQueue.offerAsync(object, time, timeUnit);
    }

    @Override
    public Boolean offerAsync(Object object) {
        boolean flag = false;
        RFuture<Boolean> rFuture = rDelayedQueue.offerAsync(object);
        try {
            flag = rFuture.get();
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        return flag;
    }
}

5.开启一个线程,持续监听

    @Resource(name = "rBlockingQueue")
    private RBlockingQueue<Object> rBlockingQueue;
 //延时队列,设置状态为已超时
    @PostConstruct
    public void take(){
        new Thread(() -> {
            while(true) {
                try {
                    Object obj = rBlockingQueue.take();
                    System.out.println(obj);
                } catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
        }).start();
    }
	

6. 调用

接下来只要调用,RedissionDelayQueue 中的方法就可以实现,过期的任务会通过rBlockingQueue.take();返回

    @Autowired
    private DelayQueue delayQueue;

	public void test(){
	  delayQueue.offer("test",10L, TimeUnit.SECONDS);
	}

上述代码缩写,take()方法将在10S后返回过期的内容test

【使用redisson完成延迟队列的功能】使用redisson配合线程池完成异步执行功能,延迟队列和不需要延迟的队列 添加延迟队列时使用,监测扫描时也会用这个工具类进行获取消息。 阅读详情

相关推荐

Spring Boot 整合:Redis 延时队列的实现方案(基于有赞的设计)

一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟HR谈薪资。这边给大家一个建议,如果你的理想薪资是30K,你完全可以跟HR谈33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是25K,你可以跟HR讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个20%涨薪。

2401_84091580的博客 1455

redis — 基于Spring Boot实现redis延迟队列

将以redis的zset来实现延时队列,本文借助SpringBoot来搭建一个演示工程。

qq_38658567的博客 3071

SpringBoot 整合:Redis延时队列的简单实现

业务流程 首先我们分析下这个流程 用户提交任务。首先将任务推送至延迟队列中。 延迟队列接收到任务后,首先将任务推送至 job pool 中,然后计算其执行时间。 然后生成延迟任务(仅仅包含任务 id)放入某个桶中 时间组件时刻轮询各个桶,当时间到达的时候从 job pool 中获得任务元信息。 监测任务的合法性如果已经删除则 pass。继续轮询。如果任务合法则再次计算时间 如果合法则计算时间,如果时间合法:根据 topic 将任务放入对应的 ready queue,然后从 bucket 中移除

m0_65462541的博客 4545

Spring Boot + Redis 实现延迟队列

通过本文的介绍,我们了解了如何使用 Spring Boot 和 Redis 实现一个简单的延迟队列。延迟队列能够有效地处理需要在特定时间点或延迟一段时间后执行的任务。在实际应用中,可以根据需求进一步扩展和优化该方案,例如增加任务重试机制、错误处理等。希望这篇文章对你有所帮助!如果有任何问题或需要进一步的说明,请随时告诉我。

yang_love1011的博客 1420

Spring Boot + Redis 实现延时队列,写得太好了

首先我们分析下这个流程。

m0_73311735的博客 958

SpringBoot系列之使用Redis实现延时队列

在项目中可能会遇到这样的业务场景,下单后,并没有支付,隔多久后,如果用户还没支付,就自动取消订单,针对这种延时支付的场景,有很多实现方法,可以用MQ来实现,但是如果针对一个小项目,要引入MQ,有时候会觉得成本有点大,那可以用redis来实现,redis实现延时队列也有多种方案,比如可以使用发布订阅模式来实现,也可以直接用zSet集合来实现,本博客通过zSet集合来实现延时队列,仅供参考。

Nicky's blog 1972

SpringBoot应用篇基于Redis实现延时队列

SpringBoot应用篇基于Redis实现延时队列延时队列,相信各位小伙伴并不会陌生,jdk原生提供了延时队列的使用,当然我们这里介绍的不是这种;在实际的项目中,如果我们有延时队列的场景,可以怎样去实现呢举一个简单的例子,如下单15分钟内,若没有支付,则自动取消订单本文将介绍一种非常非常简单的实现方式。

程序员高级码农的博客 1915

Spring Boot进阶(63):「超详细」利用 Redis 实现高效延时队列:踩坑、优化、实践

这篇文章分享了作者在使用 Redis 实现延时队列的过程中所遇到的坑和优化经验。作者首先介绍了 Redis 的有序集合数据结构,以及如何利用有序集合作为延时队列的底层实现。接着,作者分享了在实践中遇到的一些问题,例如服务宕机重启后需要重新拉取超时任务,任务过多导致 Redis 内存占用过高等。最后,作者给出了对延时队列的优化建议,例如采用批量删除任务和使用多个 Redis 实例来分散负载等。整篇文章结合了理论和实践,对于想要使用 Redis 实现高效延时队列的开发者来说是一份很有价值的参考资料。

**My Coding Family** 4114

SpringBoot 整合:Redis延时队列的简单实现(基于有赞的设计)

来源:blog.youkuaiyun.com/qq330983778/article/details/99341671设计之前学习Redis的时候发现有赞团队之前分享过一篇关于延时队列的设计:有赞延时...

Java笔记虾 1157

(六)、Springboot+Redis实现通用消息队列stater

其实除了主流的各大消息中间件ActiveMQ, RocketMQ,RabbitMQ,Kafka之外,其实Redis也是支持消息队列功能的。而有时候我们不需要引入消息队列中间件,跟缓存中间件Redis一起一起共用一个Redis作为消息中间件也是可以的,这样就少用了一个组件。

qq_35267557的博客 1031

【SpringBoot】43、SpringBoot中整合RabbitMQ实现延时队列(延时插件篇)

一、介绍 1、什么是延时队列? 延时队列即就是放置在该队列里面的消息是不需要立即消费的,而是等待一段时间之后取出消费 2、适用场景 (1)商城订单超时未支付,取消订单 (2)使用权限到期前十分钟提醒用户 (3)收益项目,投入后一段时间后产生收益 二、实现方式 从以上场景中,我们可以看出,延时队列的主要功能就是在指定的时间之后做指定的事情,那么,我们思考有哪些工具我们可以使用? 1、Redis 监听过期 Key 可以参考我的博客【SpringBoot】三十五、SpringBoot整合Redis监听Ke

JACKAL 21万+

redis 消息队列 延时队列

Spring boot 2.0 基于Redis快速实现消息队列pub/sub功能Springboot+Redis实现消息队列(生产者/消费者、发布订阅模式)SpringBoot 基于事件的Redis消息队列实现异步操作redis 实现消息队列Redis发布订阅传对象 消息队列(基于Redisson) SpringBoot 整合:Redis延时队列的简单实现(基于有赞的设计)延时队列-基于Redisson实现的延时队列生成订单30分钟未支付,则自动取消,该怎么实现?Redis 实现关闭订单...

zhaoyang10的专栏 528

【微服务】SpringBoot 整合Redis实现延时任务处理使用详解

SpringBoot 整合Redis实现延时任务处理使用详解

congge 1万+

订单超时自动取消 java_springboot 支付订单超时自动处理

今天遇到的场景如标题:支付订单超时自动处理 (待支付订单的有效期三分钟)。想到的解决方法1. 定时器2.redis 【Redis 事件通知(keyspace & keyevent notification)】3.rabbitmq 延时队列主要给大家分别讲下 方案2 和 方案3方案2 :找到机器上redis配置文件conf/redis.conf,新增一行 notify-keyspace-e...

weixin_42520909的博客 3613

告别有线:用PVE直通无线网卡,打造一台真正的‘无线’Win10软路由/测试机

本文详细介绍了如何通过PVE直通无线网卡技术,构建全无线Win10软路由或测试机。从硬件选型、PVE环境配置到PCIe和USB双模直通技术,逐步指导实现Wi-Fi AP和蓝牙连接功能,为家庭实验室和小型办公环境提供灵活高效的网络解决方案。

weixin_28683689的博客 586

火山引擎之火山方舟知识库+OpenWebUI,搭建独属于自己的AI智能客服

创建接入点,接入点名称可按个人需求而定,比如Doubao-1.5-pro-32k,在添加模型选择Doubao-1.5-pro-32k,点击确定(PS:有些模型不支持知识库,若发现后续无法选择,请重新创建推理接入点。选择应用广场,创建零代码应用,在创建好的应用设置内编辑相关信息,并选择推理接入点,即先前建好的推理接入点;此处的模型名称是火山的模型ID名称,可在OpenWebUI设置-模型 中修改名称。至此所需的apikey和模型ID和请求的api地址(可选配置,非本文重点参数)。进入火山官网,注册账号。

AmaZInGvCH的博客 2651

SpringBoot电商商城订单30分钟自动取消实现方案:从单体到分布式的最佳实践

订单超时自动取消是一个看似简单但暗藏玄机的功能。本文从单体到分布式,从简单到复杂,详细介绍了6种实现方案,并提供了完整的代码示例。业务优先:先满足业务需求,再考虑技术优化简单至上:能用简单方案解决问题,就不要过度设计可靠第一:核心业务要有补偿机制,确保数据最终一致监控完善:无论选择哪种方案,都要有完善的监控和告警最后,无论采用哪种方案,幂等性处理是必须考虑的重点,通过状态判断、乐观锁、分布式锁等多重保障,才能确保订单取消功能的正确性和可靠性。

学亮编程手记 460

ESP32S3与ILI9341 LCD屏LVGL移植实战:从零构建嵌入式GUI界面

本文详细介绍了如何在ESP32S3平台上移植LVGL图形库并驱动ILI9341 LCD屏幕,从硬件选型、开发环境配置到显示驱动实现和内存优化。通过实战案例讲解移植过程中的关键步骤和常见问题解决方案,帮助开发者快速构建嵌入式GUI界面。

h9j8k7l6m5n的博客 1096

springboot kafka 实现延时队列

延时队列的技术实现方案有:redis延时队列,Kafka延时队列,rabbit延时队列,Kafka延时队列等 本文章springboot kafka 实现延时队列,使用Kafka消费者的pause函数(暂停)和resume函数(恢复)+定时任务+事件监听机制+工厂。 延时任务的应用场景: 1,订单超时自动取消:用户下单后,如果在指定时间(半小时)内超时未完成支付,系统会自动取消订单,释放库存。 2,定时推送:比如消息通知,用户预约某个服务,系统会在服务开始前一定时间发送提醒短信。 3,定时任务 4,限时抢购

qq_41889508的博客 6万+

AI for Science:GNN预测分子性质全流程详解与工业实践

从分子表示到工业落地,一文掌握图神经网络在药物研发与材料设计中的核心实战近年来,的浪潮正深刻变革着传统科研范式。在药物研发与材料设计领域,作为核心环节,已从传统的实验试错转向基于图神经网络(GNN)的智能计算。本文将深入解析GNN预测分子性质的,涵盖数据准备、模型设计、训练优化到工业部署,并揭秘前沿技术与实战案例。

datacanvas2426的博客 1674

手把手教你用VCS+VERDI搭建数字IC验证环境(附Makefile避坑指南)

本文详细介绍了如何使用VCS编译器和VERDI调试工具搭建数字IC验证环境,涵盖从RTL设计到波形分析的全流程。重点解析了Makefile自动化构建、FSDB波形生成方法及常见问题解决方案,帮助工程师高效完成验证工作。特别提供了VCS编译参数配置和VERDI调试技巧的实用指南。

weixin_33738578的博客 447

Spring Boot中使用Redis和Lua脚本实现延时队列

通过使用Redis和Lua脚本,我们可以在Spring Boot环境中实现一个高效且可靠的延时队列系统。这种方法利用了Redis的有序集合数据结构和Lua脚本的原子性操作来确保任务的正确性和一致性。通过定期调度任务来处理到期的任务,我们可以实现各种需要延迟执行的操作,如发送提醒、执行定时任务等。

码到三十五 2万+

告别版本过低提示!微信3.9登录修复与聊天记录无缝迁移全攻略

本文详细解析了微信3.9版本过低提示的根源,并提供了完整的修复方案和聊天记录迁移指南。通过专用修复工具绕过版本检测,以及新旧版本聊天记录目录对比,帮助用户实现无缝迁移。特别提醒备份重要数据,确保操作安全。

weixin_42535461的博客 3113
上一篇: 请求后台接口,字段为null不返回问题
下一篇: 【aspose】aspose-cells-21.1 For Java 除水印
JeffHan^_^
博客等级 码龄7年 1万+粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JeffHan^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值