# 使用 Redis Stream 实现延时队列
## 一、概述
在日常开发中,我们常常需要使用队列来处理一些异步任务。而在某些场景下,我们还需要实现延时队列,即将任务延迟一段时间后再进行处理。Redis Stream 提供了一种简单且高效的方式来实现延时队列。
本文将介绍如何使用 Redis Stream 来实现延时队列,并提供详细的代码示例和解释。
## 二、整体流程
下面是实现 R            
                
                    
                        
                                                            
                                                                        
                                                                                        原创
                                                                                    
                            2023-07-29 13:49:15
                            
                                1302阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            ## 实现 Redis Stream 队列延时
### 关系图
```mermaid
erDiagram
    小白 --> 开发者: 求教
    开发者 --> 小白: 教导
```
### 整体流程
下面是实现 Redis Stream 队列延时的整体流程:
| 步骤 | 操作 |
| ---- | ---- |
| 1 | 创建一个 Redis Stream |
| 2 | 向            
                
                    
                        
                                                            
                                                                        
                                                                                        原创
                                                                                    
                            2024-06-06 05:34:32
                            
                                53阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            ## Redis Stream延时队列
在实际的生产环境中,经常会遇到需要延时处理任务的场景。为了解决这个问题,我们可以使用Redis Stream来实现延时队列的功能。
### 什么是Redis Stream?
Redis Stream是Redis 5.0版本中引入的新数据结构,它类似于消息队列,但具有更多的功能和特性。Stream可以用来保存多条消息,每条消息包含一个唯一的ID和一组键值            
                
                    
                        
                                                            
                                                                        
                                                                                        原创
                                                                                    
                            2024-05-24 05:21:51
                            
                                225阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            一、背景在业务发展过程中,会出现一些需要延时处理的场景,比如:订单下单之后超过30分钟用户未支付,需要取消订单订单一些评论,如果48h用户未对商家评论,系统会自动产生一条默认评论点我达订单下单后,超过一定时间订单未派出,需要超时取消订单等。。处理这类需求,比较直接简单的方式就是定时任务轮训扫表。这种处理方式在数据量不大的场景下是完全没问题,但是当数据量大的时候高频的轮训数据库就会比较的耗资源,导致            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-09-10 17:15:55
                            
                                437阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            深被Redis的魅力所折服,Redis不仅能快还能慢(我想也这么优秀o(╥﹏╥)o),简直利器呀咳咳咳,大家不要误会,本文很正经的啦!伙伴们跟我一起冲呀,我们一起去爬爬这座延时队列的山峰,探一探它究竟到底有高。那接下来开始我们的旅行啦~,我们都知道Redis是一种基于内存的单进程单线程数据库(Redis6.0开始之后支持多线程啦!),处理速度都非常快。那么为何Redis又能慢呢?原来,这里说的慢是            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-24 12:16:44
                            
                                254阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            一、背景在业务发展过程中,会出现一些需要延时处理的场景,比如:订单下单之后超过30分钟用户未支付,需要取消订单订单一些评论,如果48h用户未对商家评论,系统会自动产生一条默认评论点我达订单下单后,超过一定时间订单未派出,需要超时取消订单等。。处理这类需求,比较直接简单的方式就是定时任务轮训扫表。这种处理方式在数据量不大的场景下是完全没问题,但是当数据量大的时候高频的轮训数据库就会比较的耗资源,导致            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-06-21 22:01:56
                            
                                560阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            最近在倒腾自建博客后端系统,需要用到延时任务的功能,但手头只有一套MySQL和Redis,如果搞一套MQ成本有点大,于是想着用redis实现延时消息队列。有些场景用数据库的定时扫表也能简单实现延时消息的功能,不过对于我这边的实际场景(比如计数系统)其实是把数据存到redis中,如果用数据库实现延时消息会对数据库有比较大的压力。系统设计 数据结构设计事件消息体type EventEntit            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-04 14:54:51
                            
                                15阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            # Redis Stream延时处理的探索
在当今的微服务架构中,数据流的处理变得至关重要。Redis Streams提供了一种灵活的方式来处理实时数据流,而对于某些场景,我们可能需要对流数据进行延迟处理。这篇文章将探讨如何在Redis Streams中实现延时处理,同时提供实用的代码示例,帮助大家更好地理解这一概念。
## Redis Streams简介
Redis Streams是Red            
                
                    
                        
                                                            
                                                                        
                                                                                        原创
                                                                                    
                            2024-08-02 11:43:11
                            
                                59阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            List众所周知redis数据结构中的list的lpush与rpop可以用于常规消息队列,从集合的最左端写入,最右端弹出消费。并且支持多个生产者与多个消费者并发拿数据,数据只能由一个消费者拿到。但这个方案并不能保证消费者消费消息后是否成功处理的问题(服务挂掉或处理异常等),机制属于点对点模式不能做广播模式(发布/订阅模式)Pub/sub于是redis提供了相应的发布订阅功能,为了解除点对点的强绑定            
                
                    
                        
                                                            
                                                                        
                                                                                        原创
                                                                                            精选
                                                        
                            2023-06-05 14:23:12
                            
                                528阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            # 使用Redis Stream实现消息队列在Java应用中的应用
## 1. 简介
Redis Stream是Redis 5.0版本引入的新数据结构,它提供了一个类似于消息队列的功能,能够存储和传递消息。在Java应用中,我们可以利用Redis Stream来实现消息队列的功能,轻松地实现消息的生产者和消费者模式。
## 2. Redis Stream的基本操作
在使用Redis Str            
                
                    
                        
                                                            
                                                                        
                                                                                        原创
                                                                                    
                            2024-07-11 05:56:23
                            
                                278阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            最近在复习所学过的队列的知识,像什么LinkedBlockingDeque。ArrayBlockingQueue,还有ribbitmq里的乱七八糟的,其本质我感觉啊这些技术就是一些队列,只不过大体上分为单机队列和分布式队列而已,当然本文的重点在于redis实现延时队列啊,可能有人会说,用ribbitmq这个专门的消息中间件实现延时队列不香么,给消息设置个ttl,失效了放入死信队列进行监听,不就行了            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-09-26 12:03:11
                            
                                54阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            redis的zset是有序集合,默认根据score升序排序。并且可以根据scope范围查询,因此可以启动一个线程循环执行范围查询,获取当前时间之前的数据,即要执行任务,(因为不是严格按照时间匹配的,因此可能会有一点时间偏差,但一般情况下不会有影响),处理完后删除缓存。考虑到线程有可能会异常退出(比如redis连接异常等),因此使用监听者模式设计了线程重启方案,监听者会监听线程,当线程出现异常时监听            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-30 11:08:22
                            
                                180阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            在开发中,往往会遇到一些关于延时任务的需求。例如生成订单30分钟未支付,则自动取消生成订单60秒后,给用户发短信对上述的任务,我们给一个专业的名字来形容,那就是延时任务。那么这里就会产生一个问题,这个延时任务和定时任务的区别究竟在哪里呢?一共有如下几点区别1、 定时任务有明确的触发时间,延时任务没有2、 定时任务有执行周期,而延时任务在某事件触发后一段时间内执行,没有执行周期3、 定时任务一般执行            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-11-24 06:22:39
                            
                                71阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            设计之前学习Redis的时候发现有赞团队之前分享过一篇关于延时队列的设计:有赞延时队列 现在就尝试实现一下业务流程首先我们分析下这个流程用户提交任务。首先将任务推送至延迟队列中。延迟队列接收到任务后,首先将任务推送至job pool中,然后计算其执行时间。然后生成延迟任务(仅仅包含任务id)放入某个桶中时间组件时刻轮询各个桶,当时间到达的时候从job pool中获得任务元信息。监测任务的合法性如果            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-28 12:40:36
                            
                                699阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
                继之前用rabbitMQ实现延时队列,Redis由于其自身的Zset数据结构,也同样可以实现延时的操作    Zset本质就是Set结构上加了个排序的功能,除了添加数据value之外,还提供另一属性score,这一属性在添加修改元素时候可以指定,每次指定后,Zset会自动重新按新的值调整顺序。可以理解为有两列字段的数据表,一列存v            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-07-11 15:03:07
                            
                                103阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
             文章目录1. 概念2. 延迟任务的常见实现2.1 扫表2.2 MQ2.3 时间轮2.4 JDK DelayQueue、ScheduledExecutorService3. 本文方案3.1 ZSET 简介3.2 基本实现3.3 伸缩性3.3.1 无数据迁移的伸缩方案3.2 组件化 高性能4. 本文方案在信号中断监控上的应用参考附录1. ZSET2. ScheduledThreadPoolExecu            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-06-18 12:49:17
                            
                                68阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            目录一、业务场景1.1 实践场景1.2 实现方式二、Redis延时队列2.1 Redis列表实现2.2 Redis集合实现一、业务场景所谓延时队列就是延时的消息队列,下面说一下一些业务场景比较好理解1.1 实践场景订单支付失败,每隔一段时间提醒用户用户并发量的情况,可以延时2分钟给用户发短信...1.2 实现方式这些情况都可以使用延时队列来做,实现延时队列比较场景的有使用消息队列MQ来实现,比如R            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-22 23:51:20
                            
                                232阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            最近项目需要用到延迟队列,本来考虑使用MQ实现,但由于目前使用RocketMq,不支持灵活的延迟时间配置,最终采用redis实现延迟功能。一. Redis ZSET实现延迟队列大体思路:使用ZSet结构,以messageId作为value,延迟时间delayTIme作为score。每次获取小于当前时间的数据。推送消息 推送消息只是简单将数据以及延迟时间放入延迟队列中。public void pus            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-07 22:36:56
                            
                                211阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            延时消息项目重一般都能用的到,mq用于解耦,有时可能会用到延时消息(比如定时支付),但是有部分mq暂不支持延时消息,比如kafka,rocketmq支持固定的18个Level延时。当然这些可用其他方案代替,至于用到mq延时的优点后面再说。kafka的优缺点,性能等等百度很多,暂不啰嗦。介绍下kafka延时消费方案。1.kafka消费消息,按照特定格式判断是否需要延时,若需要,则可以用偏移量和top            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-02-02 14:12:39
                            
                                84阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            # Spring Cloud Stream 使用 Redis 做消息队列
在微服务架构中,消息队列是实现服务解耦、异步处理及负载均衡的重要工具之一。Spring Cloud Stream 是一个构建消息驱动微服务的框架,支持多种消息中间件,其中 Redis 作为一个高效的存储和消息队列解决方案,被广泛使用。本文将介绍如何使用 Spring Cloud Stream 和 Redis 实现消息队列,            
                
                    
                        
                                                            
                                                                        
                                                                                        原创
                                                                                    
                            2024-08-01 05:45:27
                            
                                469阅读