首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

013:Redis延时队列

有了 Redis,它就可以让我们解脱出来,对于那些只有一组消费者的消息队列,使用 Redis就可以非常轻松的搞定。...Redis 的消息队列不是专业的消息队列,它没有非常多的高级特性,没有 ack 保证,如果对消息的可靠性有着极致的追求,那么它就不适合使用。...异步消息队列 Redis 的 list(列表) 数据结构常用来作为异步消息队列使用,使用rpush/lpush操作入队列,使用 lpop 和 rpop 来出队列。...不但客户端 的 CPU 能降下来,Redis 的 QPS 也降下来了。 import time time.sleep(1) #python中的延时一秒 队列延迟 用上面睡眠的办法可以解决问题。...延时队列 这种方式比较适合异步消息处理,将当前冲突的请求扔到另一个队列延后处理以避开冲突。 延时队列的实现 延时队列可以通过 Redis 的 zset(有序列表) 来实现。

2.2K30

redis实现简单延时队列

继之前用rabbitMQ实现延时队列Redis由于其自身的Zset数据结构,也同样可以实现延时的操作 Zset本质就是Set结构上加了个排序的功能,除了添加数据value之外,还提供另一属性...操作中key理解为zset的名字,那么对延时队列又有何用呢?...; import redis.clients.jedis.JedisPool; import redis.clients.jedis.Tuple; import java.text.SimpleDateFormat...实现延时队列 * @author: xingcheng * @create: 2018-08-19 **/ public class AppTest { private static final...的lua脚本进行原子操作,即原子操作查找和删除(实现难度大) 因此,延时队列的实现最好采用rabbitMQ来实现,rabbitMQ天然具备分布式的特性,可以很好的用在多服务,多实例环境下,具体的实现参考我的第一篇博客

84730
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Redis系列之延时队列简介

    文章目录 一、业务场景 1.1 实践场景 1.2 实现方式 二、Redis延时队列 2.1 Redis列表实现 2.2 Redis集合实现 一、业务场景 所谓延时队列就是延时的消息队列,下面说一下一些业务场景比较好理解...1.1 实践场景 订单支付失败,每隔一段时间提醒用户 用户并发量的情况,可以延时2分钟给用户发短信 … 1.2 实现方式 这些情况都可以使用延时队列来做,实现延时队列比较场景的有使用消息队列MQ来实现...,比如RocketMQ等等,也可以使用Redis来实现,本博客主要介绍一下Redis实现延时队列 二、Redis延时队列 2.1 Redis列表实现 Redis实现延时队列可以通过其数据结构列表(list...10个请求就要延时10N了,这种情况系统性能不好的话就会出现线程阻塞了的情况。 队列空了的情况?...消息的延迟几乎为零 2.2 Redis集合实现 Redis的有序集合(zset)也可以用于实现延时队列,消息作为value,时间作为score,这里顺便复习一下Redis的有序集合 //9.0是score

    78450

    玩转redis-延时消息队列

    上一篇基于redis的list实现了一个简单的消息队列:玩转redis-简单消息队列 源码地址 使用demo 产品经理经常说的一句话,我们不光要有X功能,还要Y功能,这样客户才能更满意。...同样的,只有简单消息队列是不够的,还要有延时消息队列才能算是一个完整的消息队列。...看看redis的命令,放眼望去,的有序集合(sorted set)就是一个很好用的命令,完全可以用他做一个延时消息队列 ?...redis有序集合(sorted set) redis有序集合,每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。...6379> ZRANGEBYSCORE testSet1 -inf inf 1) "b" 2) "a" 3) "d" 4) "c" 删除数据 ZREMRANGEBYSCORE testSet1 0 2 延时队列的实现思路

    1.1K30

    Redis学习笔记之延时队列

    一、业务场景 所谓延时队列就是延时的消息队列,下面说一下一些业务场景比较好理解 1.1 实践场景 订单支付失败,每隔一段时间提醒用户 用户并发量的情况,可以延时2分钟给用户发短信 … 1.2 实现方式...这些情况都可以使用延时队列来做,实现延时队列比较场景的有使用消息队列MQ来实现,比如RocketMQ等等,也可以使用Redis来实现,本博客主要介绍一下Redis实现延时队列 二、Redis延时队列 2.1...Redis列表实现 Redis实现延时队列可以通过其数据结构列表(list)来实现,顺便复习一下Redis的列表,实现列表,Redis可以通过队列和栈来实现: /* 队列:First in first...10个请求就要延时10N了,这种情况系统性能不好的话就会出现线程阻塞了的情况。 队列空了的情况?...消息的延迟几乎为零 2.2 Redis集合实现 Redis的有序集合(zset)也可以用于实现延时队列,消息作为value,时间作为score,这里顺便复习一下Redis的有序集合 //9.0是score

    2.3K30

    redis实现简单延时队列

    继之前用rabbitMQ实现延时队列Redis由于其自身的Zset数据结构,也同样可以实现延时的操作     Zset本质就是Set结构上加了个排序的功能,除了添加数据value之外,还提供另一属性...操作中key理解为zset的名字,那么对延时队列又有何用呢?...; import redis.clients.jedis.JedisPool; import redis.clients.jedis.Tuple; import java.text.SimpleDateFormat...实现延时队列 * @author: xingcheng * @create: 2018-08-19 **/ public class AppTest { private static final...的lua脚本进行原子操作,即原子操作查找和删除(实现难度大) 因此,延时队列的实现最好采用rabbitMQ来实现,rabbitMQ天然具备分布式的特性,可以很好的用在多服务,多实例环境下,具体的实现参考我的第一篇博客

    1.4K40

    基于Redis实现延时队列服务

    三、 基于Redis实现 1.0版本 2.0版本 ---- 一、背景 在业务发展过程中,会出现一些需要延时处理的场景,比如: 订单下单之后超过30分钟用户未支付,需要取消订单 订单一些评论,如果48h...所以在处理这类需求时候,采用了延时队列来完成。...“推荐下自己做的 Spring Boot 的实战项目: https://github.com/YunaiV/ruoyi-vue-pro 二、几种延时队列 *延时队列就是一种带有延迟功能的消息队列。...2.Rocketmq延时队列优点:消息持久化,分布式 缺点:不支持任意时间精度,只支持特定level的延时消息3.Rabbitmq延时队列(TTL+DLX实现)优点:消息持久化,分布式 缺点:延时相同的消息必须扔在同一个队列...支持指定消息remove * 高可用性 整体结构 - Messages Pool所有的延时消息存放,结构为KV结构,key为消息ID,value为一个具体的message(这里选择Redis Hash

    41730

    Redis应用-异步消息队列延时队列

    异步消息队列 说道消息队列,你肯定会想到Kafka、Rabbitmq等消息中间件,这些专业的消息中间件提供了很多功能特性,当然他的部署使用维护都是比较麻烦的。...如果你对消息队列没那么高要求,想要轻量级的,使用Redis就没错啦。...Redis通过list数据结构来实现消息队列.主要使用到如下命令: lpush和rpush入队列 lpop和rpop出队列 blpop和brpop阻塞式出队列 废话补不多说上代码:...$redis = new Redis(); $redis->connect('127.0.0.1', 6379); //发送消息 $redis->lPush($list, $value); //消费消息...延迟队列 你是否在做电商项目的时候会遇到如下场景: 订单下单后超过一小时用户未支付,需要关闭订单 订单的评论如果7天未评价,系统需要自动产生一条评论 这个时候我们就需要用到延时队列了,顾名思义就是需要延迟一段时间后执行

    70520

    Redis应用-异步消息队列延时队列

    异步消息队列 说道消息队列,你肯定会想到Kafka、Rabbitmq等消息中间件,这些专业的消息中间件提供了很多功能特性,当然他的部署使用维护都是比较麻烦的。...如果你对消息队列没那么高要求,想要轻量级的,使用Redis就没错啦。...Redis通过list数据结构来实现消息队列.主要使用到如下命令: lpush和rpush入队列 lpop和rpop出队列 blpop和brpop阻塞式出队列 ?...废话补不多说上代码: $redis = new Redis(); $redis->connect('127.0.0.1', 6379); //发送消息 $redis->lPush($list, $value...延迟队列 你是否在做电商项目的时候会遇到如下场景: 订单下单后超过一小时用户未支付,需要关闭订单 订单的评论如果7天未评价,系统需要自动产生一条评论 这个时候我们就需要用到延时队列了,顾名思义就是需要延迟一段时间后执行

    72010

    Redis 如何实现延时任务队列

    简介 顾名思义,延迟队列就是进入该队列的消息会被延迟消费的队列。而一般的队列,消息一旦入队了之后就会被消费者马上消费。...延时任务和定时任务区别 延时任务有别于定时任务,定时任务往往是固定周期的,有明确的触发时间。...当业务越来越多时,发现扫表部分的逻辑会重复开发,但是非常类似 缓存队列设计 场景设计 实际的生产场景是笔者负责的某个系统需要对接一个外部的资金方,每一笔资金下单后需要延时30分钟推送对应的附件。...延时队列的实现 选用了基于Redis的有序集合Sorted Set和Crontab短轮询进行实现。...消费延迟队列消息后(zset结构中扫描到期的消息),不及时消费 把读取的消息放入一个 redis stream 队列,同时加入消费组 通过消费组消费 redis stream 消费,处理业务逻辑 Redis

    73211

    Redis系列(十四)应用之延时队列

    Redis 的有序列表数据类型,可以说是作为延时队列极其优秀的一个载体,因此被很多公司采用。今天就实现一个基本的延时队列,暴露对应的方法出来。...为什么叫基本的延时队列呢,因为本文是侧重于 Redis 的封装的,所以对于消息队列注重的很多特性没有实现,比如消息的 ACK, 以及失败重试等 目录 设计 Java 实现代码 Java 代码测试 服务化...但是本文不实现服务级别的延迟队列,仅在后文简单介绍一下(因为本文是 Redis 系列,而不是延迟队列系列). 本文对 Redis 进行简单封装,提供一个DelayQueue类出来使用。...基本原理就是: 启动一个服务,内部负责维护延时队列,负责轮询延时队列,之后将多个业务方的定时任务进行分发,然后由业务方消费到进行逻辑处理。...对于服务化的延时队列,其核心对 Redis 的使用和本文也基本一致,只是会额外添加许多其他功能,比如支持多个业务方,支持任务分发,支持任务 ACK 以及失败重试等。

    92420

    Kafka延时队列

    定时器 服务端创建的延迟操作会作为⼀个定时任务,加⼊定时器的延迟队列中。当延迟操作超时后,定时器会将延迟操作从延迟队列中弹出,并调⽤延迟操作的运⾏⽅法,强制完成延迟的操作。...定时器使⽤延迟队列管理服务端创建的所有延迟操作,延迟队列的每个元素是定时任务列表,⼀个定时任务列表可以存放多个定时任务条⽬。...时间轮和延迟队列的关系: 1,定时器拥有⼀个全局的延迟队列和时间轮,所有时间轮公⽤⼀个计数器。 2,时间轮持有延迟队列的引⽤。...3,定时任务条⽬添加到时间轮对应的时间格(槽)(槽中是定时任务列表)中,并且把该槽表也会加⼊到延迟队列中。 4,⼀个线程会将超时的定时任务列表会从延迟队列的poll⽅法弹出。...时间轮包含了定时器全局的延迟队列

    2.3K61

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

    首先将任务推送至延迟队列中。 延迟队列接收到任务后,首先将任务推送至job pool中,然后计算其执行时间。...对象 我们现在可以了解到中间存在的几个组件 延迟队列,为Redis延迟队列。实现消息传递 Job pool 任务池保存job元信息。...文章中并没有说明响应超时后如何处理,所以个人现在将其重新投入了待处理队列。 文章中因为使用了集群,所以使用redis的setnx锁来保证多个时间循环处理多个桶的时候不会出现重复循环。...String bucketName) { return redisTemplate.boundZSetOps(bucketName); } /** * 放入延时任务...DelayJob) { return (DelayJob) value; } return null; } /** * 移除延时任务

    1.3K20

    延时队列优化 (2)

    在这里新增了一个队列QC,绑定关系如下,该队列不设置TTL时间  配置类文件: @Bean("queueC") public Queue queueC() { HashMap...public void sendMsg(@PathVariable String message) // { // // log.info("当前时间:{},发送一条消息给俩个TTL队列...Channel channel) { String s = new String(message.getBody()); log.info("当前时间{},死信队列...} 看起来似乎没什么问题,但是在最开始的时候,就介绍过如果使用在消息属性上设置TTL的方式,消息可能并不会按时“死亡“,因为RabbitMQ只会检查第一个消息是否过期,如果过期则丢到死信队列..., 如果第一个消息的延时时长很长,而第二个消息的延时时长很短,第二个消息并不会优先得到执行。

    1.4K30

    rabbitMq实现延时队列

    topic:将消息路由到binding key与routing key模式匹配的队列中。 言归正传,延时队列如何通过rabbitmq来实现呢?...分析:首先rabbitmq自己是不具备延时的功能的,除了使用官方提供的插件之外,我们还可以通过ttl(设置超时时间的方式)+ DLX(一个死信队列)的方式来实现 + Router(转发队列) 其中,ttl...此外,死信队列是一个普通的队列,它没有消费者,用来存储有超时时间信息的消息,并且可以设置当消息超时(ttl),转发到另一个指定队列(此处设置转发到router, 当发送消息之后(发送时,带上要延时队列名称...org.springframework.context.annotation.Configuration; import java.util.HashMap; import java.util.Map; /** * @program: test * @description: 延时队列...import java.text.SimpleDateFormat; import java.util.Date; /** * @program: test * @description: 延时队列启动类

    1.4K30

    如何实现异步队列&&延时队列

    redis异步队列依赖双向链表List有三种方式实现 1.利用rpush queue value1 rpush queue value2生产消息 lpop key消费 缺点:lpop不会等待rpush生产后...,队列中有值再进行再消费 弥补:可以通过在应用层引入Sleep机制去调用LPOP重试 比较麻烦 2.BLPOP key timeout:阻塞直到队列有消息或者超时 用blpop改善后如果有值会直接取出...(pub)发送消息,订阅者(sub)接收消息 订阅者可以订阅任意数量的频道 缺点:pub/sub的缺点消息的发布是无状态的,无法保证可达,如果想更安全只有使用一些完善的消息中间件如RabbitMQ Redis...如何实现延时队列 使用sortedset,拿时间戳作为score,消息内容作为key调用zadd来生产消息,这样就可以根据时间戳来进行一个排序了,消费者用zrangebyscore指令获取N秒之前的数据轮询进行处理

    81330
    领券