最近项目需要用到延迟队列,本来考虑使用MQ实现,但由于目前使用RocketMq,不支持灵活延迟时间配置,最终采用redis实现延迟功能。一. Redis ZSET实现延迟队列大体思路:使用ZSet结构,以messageId作为value,延迟时间delayTIme作为score。每次获取小于当前时间数据。推送消息 推送消息只是简单将数据以及延迟时间放入延迟队列中。public void pus
转载 2023-08-07 22:36:56
204阅读
一、Demo用法public static void main(String[] args) throws InterruptedException, UnsupportedEncodingException { Config config = new Config(); config.useSingleServer().setAddress("redis://172.29.2.10:7000
最近在复习所学过队列知识,像什么LinkedBlockingDeque。ArrayBlockingQueue,还有ribbitmq里乱七八糟,其本质我感觉啊这些技术就是一些队列,只不过大体上分为单机队列和分布式队列而已,当然本文重点在于redis实现延时队列啊,可能有人会说,用ribbitmq这个专门消息中间件实现延时队列不香么,给消息设置个ttl,失效了放入死信队列进行监听,不就行了
设计之前学习Redis时候发现有赞团队之前分享过一篇关于延时队列设计:有赞延时队列 现在就尝试实现一下业务流程首先我们分析下这个流程用户提交任务。首先将任务推送至延迟队列中。延迟队列接收到任务后,首先将任务推送至job pool中,然后计算其执行时间。然后生成延迟任务(仅仅包含任务id)放入某个桶中时间组件时刻轮询各个桶,当时间到达时候从job pool中获得任务元信息。监测任务合法性如果
在开发中,往往会遇到一些关于延时任务需求。例如生成订单30分钟未支付,则自动取消生成订单60秒后,给用户发短信对上述任务,我们给一个专业名字来形容,那就是延时任务。那么这里就会产生一个问题,这个延时任务和定时任务区别究竟在哪里呢?一共有如下几点区别1、 定时任务有明确触发时间,延时任务没有2、 定时任务有执行周期,而延时任务在某事件触发后一段时间内执行,没有执行周期3、 定时任务一般执行
一、背景在业务发展过程中,会出现一些需要延时处理场景,比如:订单下单之后超过30分钟用户未支付,需要取消订单订单一些评论,如果48h用户未对商家评论,系统会自动产生一条默认评论点我达订单下单后,超过一定时间订单未派出,需要超时取消订单等。。处理这类需求,比较直接简单方式就是定时任务轮训扫表。这种处理方式在数据量不大场景下是完全没问题,但是当数据量大时候高频轮训数据库就会比较耗资源,导致
    继之前用rabbitMQ实现延时队列Redis由于其自身Zset数据结构,也同样可以实现延时操作    Zset本质就是Set结构上加了个排序功能,除了添加数据value之外,还提供另一属性score,这一属性在添加修改元素时候可以指定,每次指定后,Zset会自动重新按新值调整顺序。可以理解为有两列字段数据表,一列存v
文章目录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
目录一、业务场景1.1 实践场景1.2 实现方式二、Redis延时队列2.1 Redis列表实现2.2 Redis集合实现一、业务场景所谓延时队列就是延时消息队列,下面说一下一些业务场景比较好理解1.1 实践场景订单支付失败,每隔一段时间提醒用户用户并发量情况,可以延时2分钟给用户发短信...1.2 实现方式这些情况都可以使用延时队列来做,实现延时队列比较场景有使用消息队列MQ来实现,比如R
转载 2023-08-22 23:51:20
216阅读
Redis 延时队列Redis消息队列不是专业消息队列, 没有非常多高级特性, 没有ack保证, 如果对消息可靠性有极致追求, 那么它就不适合使用。异步消息队列Redislist(列表)数据结构常用来作为异步消息队列使用,使用rpush/lpush操作入队列, 使用lpop和rpop出队列队列空了怎么办客户端是通过队列pop操作来获取消息,然后进行处理,处理完了在接着获取消息,在进
转载 2023-05-23 15:09:21
586阅读
一、应用场景:对于只有一组消费者消息队列,使用 Redis 。从而避免了 Kafka 、RabbitMQ 等专业消息队列在只有一组消费者时,还进行繁琐绑定过程。注意: Redis 消息队列不是专业消息队列,它没有非常多高级特性,没有 ack 保证,对消息可靠性有着极致追求情况下,其不适合使用。二、实现list 链表结构常用于作为异步消息队列使用,使用 rpush / lpush
转载 2023-05-30 16:04:26
101阅读
直接上代码了 <?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Ill ...
转载 2021-09-16 11:08:00
922阅读
2评论
背景在业务发展过程中,会出现一些需要延时处理场景,比如:a.订单下单之后超过30分钟用户未支付,需要取消订单b.订单一些评论,如果48h用户未对商家评论,系统会自动产生一条默认评论c.点我达订单下单后,超过一定时间订单未派出,需要超时取消订单等。。。 处理这类需求,比较直接简单方式就是定时任务轮训扫表。这种处理方式在数据量不大场景下是完全没问题,但是当数据量大时候高频轮训数据库就会比较
redis延时队列常用消息队列我们常见 MQ 有 RabbmitMq、Kafka、RecoketMQ 等等,他们都是专业级消息队列,各有各特性。但他们共同特性就是比较复杂。有没有一种非常简单,同样也非常高效消息队列呢? 使用 redis 我们可以非常简单实现一个高效消息队列redis 消息队列使用场景使用 redis 实现消息队列虽然简单,但是与专业级相比,肯
文章目录配置基于redission api服务订单阻塞队列 在工作中,我们经常会遇到一些场景,比如订单到期未支付导致取消,或者到期后自动续费等。在这些情况下,我们发现延迟队列非常适合使用。常见延迟队列实现包括rabbitMQ死信队列和RocketMQ延迟队列。然而,有时候项目规模较小,没有引入消息中间件,但又需要使用延迟队列场景。在这种情况下,我们可以利用已有的redis实现延迟
## 实现 Redis Stream 队列延时 ### 关系图 ```mermaid erDiagram 小白 --> 开发者: 求教 开发者 --> 小白: 教导 ``` ### 整体流程 下面是实现 Redis Stream 队列延时整体流程: | 步骤 | 操作 | | ---- | ---- | | 1 | 创建一个 Redis Stream | | 2 | 向
原创 2月前
19阅读
## Redis Stream延时队列 在实际生产环境中,经常会遇到需要延时处理任务场景。为了解决这个问题,我们可以使用Redis Stream来实现延时队列功能。 ### 什么是Redis Stream? Redis Stream是Redis 5.0版本中引入新数据结构,它类似于消息队列,但具有更多功能和特性。Stream可以用来保存多条消息,每条消息包含一个唯一ID和一组键值
原创 3月前
56阅读
背景在后端服务中,经常有这样一种场景,写数据库操作在异步队列中执行,且这个异步队列是多进程运行,这时如果对同一资源进行写库操作,很有可能产生数据被覆盖等问题,于是就需要业务层在更新数据库之前进行加锁,这样保证在更改同一资源时,没有其他更新操作干涉,保证数据一致性。但如果在更新前对数据库更新加锁,那此时又来了新更新数据库请求,但这个更新操作不能丢弃掉,需要延迟执行,那这就需要添加到延迟队列中,
转载 2023-07-29 19:44:04
78阅读
目录前言延迟队列定义应用场景实现方案 Redis zsetTimeWheel时间轮结构时间轮运行逻辑总结前言延迟队列是我们日常开发中,较为频繁接触一种技术方案。顾名思义,延迟队列就是具有延迟功能消息队列。比如往该队列里投递了一个延时为60s信息,那么60s后就能收到该信息。自己在网上搜索资料整理,学习一下,为此进行了一次总结并且把知识分享出来。延迟队列定义首先,大家对队列数据结构一定不
Redis怎么实现延时队列?[面试7.0]Redis实现延时队列场景: 在淘宝,京东等购物平台上下单,超过一定时间未付款,订单会
原创 2022-11-17 10:38:19
81阅读
  • 1
  • 2
  • 3
  • 4
  • 5