首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏互联网技术栈

    Redis 队列

    下面讲一个新手容易犯的错误,在这个示例中把队列的入队、出队和Redis存储节点的主从关系给混淆了,示例如下 存储: Redis主节点M, 使用数据List类型做为队列,列表名称M (标记为M.L,意为主节点上的 image.png 上图显然不是我们想要的结果,这种设计导致的问题是Redis主节点使用的内存会不断增长直至触发Redis的LRU策略导致数据丢失或者无法入队。 Redis的从节点S仅仅是做为主节点M的一个备份节点存在的。 ? 可靠队列Redis的列表(List)实现的队列中,一般一个客户端通过LPUSH命令将消息放入队列中,而另一个客户端通过RPOP/BRPOP 命令有顺序的取出队列中的消息进行消费。 使用Redis数据结构实现的方式是按照优先权建队列(列表),相同优先权的元素在同一个队列中,客户端在使用BRPOP/RPOP命令使队列中的元素出队的时候参数按照优先权从高到低的顺序进行。

    2K50发布于 2018-12-12
  • 来自专栏快乐阿超

    redis队列

    首先是配置类 分为Redis配置类和Jackson配置类,主要是用于收发消息时序列化 Jackson的 package com.ruben.config; import java.text.SimpleDateFormat jackson2JsonRedisSerializer.setObjectMapper(objectMapper); return jackson2JsonRedisSerializer; } } redis ; import org.springframework.data.redis.listener.ChannelTopic; import org.springframework.data.redis.listener.RedisMessageListenerContainer ; import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer private ObjectMapper objectMapper; /** * Callback for processing received objects through Redis

    42620编辑于 2022-08-21
  • 来自专栏Java架构师必看

    redis 队列_Redis之延迟队列的实现

    延迟队列,顾名思义它是一种带有延迟功能的消息队列。那么,是在什么场景下我才需要这样的队列呢? 1. 使用Redis的zset、list的特性,我们可以利用redis来实现一个延迟队列RedisDelayQueue 2. 设计目标 实时性:允许存在一定时间的秒级误差 高可用性:支持单机、支持集群 支持消息删除:业务会随时删除指定消息 消息可靠性:保证至少被消费一次 消息持久化:基于Redis自身的持久化特性,如果Redis 设计方案     设计主要包含以下几点     将整个Redis当做消息池,以KV形式存储消息     使用ZSET做优先队列,按照Score维持优先级     使用LIST结构,以先进先出的方式消费 一次,判断队列中是否有待消费的JOB。

    1K40发布于 2021-08-23
  • 来自专栏程序员备忘录

    redis in action》Redis队列

    使用redis做任何事情都是基于redis提供的数据结构,那么消息队列有哪几种类型?之前rabbitmq咋说有简单的队列、优先级队列、延迟队列等等。但是那时候咋也没说栈这东西。 那么redis如何做这些事,根据之前的学习。肯定使用list了。 Redis队列(先进先出) 队列中我们说redis提供了很多操作队列的方法。可以从左边添加、右边添加、左边获取、右边获取等等等。 所以说有了这些方法,用redis做个简单的队列简直是太容易了。比如我们要做一个先进先出的队列Redis优先级队列(按优先级高低进行排序) 我们的任务发送到redis中,然后任务要具有一定的顺序,这个顺序是优先级。 Riedis做延迟队列(指定时间执行) Redis做延迟队列其实还是用zset去做,我们用当前的时间+需要延迟的时间作为zset的score,然后我们按照score的增序来获取对应的元素,通过判断时间是否小于当前时间然后执行相关的动作

    59710编辑于 2022-08-11
  • 来自专栏巡天遥看一千河

    redis消息队列

    消息队列的特征 消息队列在存取消息时,必须要满足三个需求,分别是 消息保序 处理重复的消息 保证消息可靠性 消息保序 对于 单队列,单进程的queue, 是满足先入先出的特点的,本身是有序的,但是如果有多个队列或多个消费者线程的时候 stream的缺点就是在redis内部,stream就是一个单一的key,如果不对key进行分片,那么stream的容量被限制在单个redis的实例, 当然我们可以使用redis cluster对stream 的key进行分片,实现类似kafka多partition的概念,但是由于redis cluster的一些限制,需要解决redis原生命令不支持跨slot操作的问题, 当然经过合理的设计,这并不是一个很大的问题 XPENDING 命令可以用来查询每个消费组内所有消费者已读取但尚未确认的消息,而 XACK 命令用于向消息队列确认消息处理已完成 在用Redis当作队列或存储数据时,是有可能丢失数据的:一个场景是, 总的来说,Redis不保证严格的数据完整性和主从切换时的一致性。我们在使用Redis时需要注意。 而采用RabbitMQ和Kafka这些专业的队列中间件时,就没有这个问题了。

    1.1K20发布于 2021-04-22
  • 来自专栏半月无霜

    Redis实现消息队列及延迟队列

    Redis实现消息队列及延迟队列 一、介绍 在选择消息中间件的问题上,我们有很多解决方案,具体选择哪一种还是要根据实际的情况来进行确认。 再如果,推送的消息比较简单,又恰好有个redis,那么就选择redis吧。 下面,将进行介绍,如果使用redis作为消息队列,我们该如何编写这段程序。 在redis实现延迟队列之前,我有必要说一下set和zset,主要是这个zset set大家都很熟悉,与list不同,set是无序且内部元素不重复。 score保证了队列中的消息有序性,且作为时间戳,所以可以完成延迟队列的对应功能。 注意事项和上面的普通队列差不多,简单注意一下就好。 ,服务器的负担会增大 所以,如果是简单的日志推送,消息推送等,可以使用redis队列

    2.4K30编辑于 2023-03-03
  • 来自专栏weixuqin 的专栏

    redis 学习(11)-- redis pipeline

    redis pipeline 什么是流水线(pipeline) 首先来看 redis 执行一次操作所需要的时间: 1 次时间 = 1 次网络时间 + 1次命令时间 ? 对比如下: M操作在Redis队列中是一个原子操作,pipeline不是原子操作 pipeline与M操作都会将数据顺序的传送顺序地返回(redis 单线程) M 操作一个命令对应多个键值对,而Pipeline 是多条命令 pipeline注意事项 每次pipeline携带数量不推荐过大,否则会影响网络性能 pipeline每次只能作用在一个Redis节点上 pipeline-Jedis使用 Maven 依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0

    94320发布于 2019-06-02
  • 来自专栏shigen的学习笔记

    redis实现消息队列

    redis实现消息队列 list list这种数据结构天然的支持消息队列,常用的命令如下: 命令 描述 LPUSH key list实现的方式测试效果: 图片 最后,总结一下list实现消息队列的优缺点: 优点: 简单易用:Redis的List数据结构操作简单,易于理解和使用。 不支持消息持久化:Redis的List数据结构默认存储在内存中,当Redis重启或宕机时,消息也会丢失。 参考文章:redis灵魂拷问:如何使用stream实现消息队列 如何在Springboot中使用Redis5的Stream 定义生产消息的messageProcuder 图片 主要是用来实现消息的发送 好了,以上就是《redis实现消息队列》的全部内容了。

    2.1K60编辑于 2023-09-08
  • 来自专栏Java实战博客

    Redis 消息队列思想

    Redis实现消息队列有3中方式 利用Redis的LIST数据结构的有序特性 Pub/Sub 发布订阅模式 Stream LIST消息队列 List数据类型的入口、出口不一致。 可以保证有序性 常用命令 LPUSH与RPOP 或 RPUSH与LPOP是非阻塞式队列 LPUSH与BRPOP 或 RPUSH与BLPOP是阻塞式队列 缺点:无法避免消息丢失(拿到消息后,消息就在队列删除了 ,如果宕机,消息相当于没了)、只支持1个消费者(不像广播模式,多个消费者支持消费) Pub/Sub模式 Redis2.0引入的功能,一个发布,全体订阅得到通知 常用命令 SUBSCRIBE channel 向一个频道发送消息 PSUBSCRIBE pattern:订阅通配符的频道 缺点:无法持久化、无法避免消息丢失、(消费者自己来不及处理所有就会堆积)消息堆积有上限 Stream 新的数据类型 Stream是Redis5.0 p=77&share_source=copy_web&vd_source=164fe0eebbe1de2dc8ea1db9b173c783 本身Redis就不适合做消息队列,放弃了!命令极其复杂!

    52620编辑于 2022-08-23
  • 来自专栏ops技术分享

    redis入门(11

    Redis3.0 Redis3.0在2015年4月1日正式发布,截止到本书完成已经到3.0.7版本,相比于Redis2.8主要特性如下: Redis3.0最大的改动就是添加Redis的分布式实现Redis Cluster,填补了Redis官方没有分布式实现的空白。 Redis Cluster经历了4年才正式发布也是有原因的,具体可以参考Redis Cluster的开发日志 1) Redis Cluster: Redis的官方分布式实现。 9) Redis日志小做调整:日志中会反应当前实例的角色(master或者slave)。 10) incr命令性能提升。

    44200发布于 2021-05-18
  • 来自专栏JAVA后端开发

    redis实现消息队列

    消息队列一般都会想到kafka,rabbitmq,Rockermq, 其实,给你印像做缓存的Redis也是能做消息队列. redis消息队列生产者如下: @Service public class MessageQueueRedisProducerServiceImpl Override public boolean support(String producerType) { return Objects.equals(producerType,"redis "); } } 其中,只要调用convertAndSend方法就可以产生队列 2 redis消息队列消费者如下: public class MessageQueueRedisConsumerListener messageQueueConsumerServiceList.stream().filter(messageQueueConsumerService -> messageQueueConsumerService.support("redis 类MessageQueueRedisConsumerServiceFactory 主要是用于注册监听器,要监听哪种主题,并这种主题使用哪种数据处理类 至此,redis的消息队列已完成.

    1.1K20发布于 2020-06-02
  • 来自专栏Lansonli技术博客

    LaravelLumen 使用 redis队列

    connections配置项包含了Laravel支持的所有队列驱动,我们使用Redis驱动,所以需要配置redis项:connection对应config/database.php中redis的default 要使用 redis 队列驱动,需要在配置文件 config/database.php 中配置 Redis 数据库连接。 如果 Redis 队列连接使用 Redis Cluster(集群),队列名称必须包含 key hash tag,以确保给定队列对应的所有 Redis keys 都存放到同一个 hash slot: 'redis ' => 90, ], 注:对一般中小型应用推荐使用  Redis 作为队列驱动。 7、频率限制 注:该功能要求应用可以与 Redis 服务器进行交互。 如果应用使用了 Redis,那么可以使用时间或并发来控制队列任务。

    3.2K20发布于 2021-10-09
  • 来自专栏Owen's World

    laravel 基于redis队列

    配置文件 config/queue.php 'default' =>env('QUEUE_CONNECTION', 'redis'), 队列文件 <? / $data = [ // [ // 'title' => 'a1', // 'sort' => '11

    51020编辑于 2023-05-06
  • 来自专栏知识同步

    redis实现消息队列

    搬运,redis做消息队列的几种方法和优缺点 Redis 怎么做消息队列? 一个完整的发布、订阅消息处理流程是这样的: 消费者订阅指定队列Redis 就会记录一个映射关系:队列->消费者 生产者向这个队列发布消息,那 Redis 就从映射关系中找出对应的消费者,把消息转发给它 原因在于 Redis 本身的一些问题,如果把其定位成消息队列,还是有些欠缺的。 到这里,就不得不把 Redis 与专业的队列中间件做对比了。 综上,我们可以看到,把 Redis 当作队列来使用时,始终面临的 2 个问题: Redis 本身可能会丢数据 面对消息积压,Redis 内存资源紧张 到这里,Redis 是否可以用作队列,我想这个答案你应该会比较清晰了 之后又把 Redis 和专业的消息队列中间件做对比,发现 Redis 的不足之处。 最后,我们得出 Redis队列的合适场景。 这里我也列了一个表格,总结了它们各自的优缺点。

    1.2K20编辑于 2022-12-26
  • 来自专栏Lvshen的技术小屋

    Redis实现延迟队列

    什么是延迟队列 所谓的延迟队列就是,生产者的消息推送到队列中,消费者不会马上消费,而是到了设置的指定的时间才消费。可以采用Redis的zset来实现。将消息序列化成一个字符串作为zset的value。 代码逻辑 将任务放到队列中,设置延迟时间 /** * 任务放入队列中 * @param msg 任务信息 * @param afterTime 延迟时间 */ public void ,sleep一下再重新循环,sleep是为了缓解redis压力 if (values.isEmpty()) { try { Thread.sleep continue; } //不为空,获取值 String next = values.iterator().next(); //将redis @Test public void testDelayQueue() { String queueKey = "redis_delay_queue"; delayingQueue.setQueueKey

    77920编辑于 2022-05-05
  • 来自专栏爬虫逆向案例

    013:Redis延时队列

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

    2.8K30发布于 2021-11-22
  • 来自专栏从码农的全世界路过

    Redis消息队列 | Stream

    消息是持久化的, Redis重启时, 消息不会丢失. 1 XADD 向指定队列中添加信息. xadd key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] 队列的长度,最小ID等信息; *|ID 消息ID,可以自定义或Redis 自动生成; 自定义生成时, 需要保证单调递增; 使用符号"*"表示由Redis生成; 按时间戳-序号规则生成, 可以减轻 Redis服务准确计算队列长度的压力; 127.0.0.1:6379> XTRIM mystream MAXLEN ~ 1000 6 XDEL 删除指定ID消息 127.0.0.1:6379> 1622700074168-0 (integer) 1 127.0.0.1:6379> xpending mystream mygroup - + 10 (empty array) 127.0.0.1:6379> 11 radix-tree-nodes" 6) (integer) 2 7) "last-generated-id" 8) "1622603679677-0" 9) "groups" 10) (integer) 1 11

    1.7K30编辑于 2022-06-27
  • 来自专栏技术杂记

    Redis 复制11

    ,以顺利进行连接设置密码到配置文件跟复制和只读设置一样,运行时的配置在重启后将丢失,要想重启后依然生效,得修改配置文件master side[root@m1 ~]# grep requirepass redis.conf "requirepass" configurationrequirepass 123456[root@m1 ~]# slave side[root@m2 tmp]# grep masterauth redis.conf

    29830编辑于 2022-07-10
  • 来自专栏兜兜毛毛

    Redis 集群(11

    1、性能 Redis本身的QPS已经很高了,但是如果在一些并发量非常高的情况下,性能还是会受到影响。这个时候我们希望有更多的Redis服务来完成工作。 2、扩展 第二个是出于存储的考虑。 /redis-server --slaveof 192.168.1.100 6379 或在客户端直接执行slaveofxxxx,使该Redis实例成为从节点。 它是一个特殊状态的redis实例。 我们会启动一个或者多个Sentinel的服务(通过src/redis-sentinel),它本质上只是一个运行在特殊模式之下的Redis,Sentinel通过info命令得到被监听Redis机器的master Redis虚拟槽分区 Redis既没有用哈希取模,也没有用一致性哈希,而是用虚拟槽来实现的。 Redis创建了16384个槽(slot),每个节点负责一定区间的slot。

    77520发布于 2020-03-19
  • 来自专栏全栈程序员必看

    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); //消费消息 这个问题我们可以通过blpop/brpop 来阻塞读取队列。 blpop/brpop在队列没有数据的时候,会立即进入休眠状态,一旦数据到来,则立刻醒过来。消息的延迟几乎为零。

    96120编辑于 2022-07-19
领券