Redis5新特性-stream

2023-12-04 16:52
文章标签 特性 stream redis5

本文主要是介绍Redis5新特性-stream,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Stream队列

        Redis5.0 最大的新特性就是多出了一个数据结构 Stream,它是一个新的强大的 支持多播的可持久化的消息队列,作者声明 Redis Stream 地借鉴了 Kafka 的设计。

生产者

xadd 追加消息

xdel 删除消息,这里的删除仅仅是设置了标志位,不会实际删除消息。

xrange 获取消息列表,会自动过滤已经删除的消息

xlen 消息长度

del 删除 Stream

1. 追加消息

xadd streamtest1 * name kk age 30

xadd:新增消息固定写法

streamtest1:队列名, 可任意

*:让redis自动生成id

2. 获取消息列表

xrange streamtest1 - +

xrange streamtest1 1701655814064-0 +

-表示最小值, +表示最大值, 也可以换成具体的消息id

3. 删除消息

只给消息打上标志位, 不会真删消息

xdel streamtest1 1701655821193-0

4. 删除整个stream

del streamtest1

消费者

单消费者 xread

1. 从头开始读

xread count 1 block 0 streams streamtest 0-0

count 1: 读取数量1

block 0: 阻塞

0-0:从头开始读

2. 从指定id开始读

xread count 1 block 0 streams streamtest 1701659324617-0

3. 从结尾开始读-阻塞到有消息

xread count 1 block 0 streams streamtest $

消费群组 xgroup

1. 创建消费者群组

xgroup create streamtest cg1 0-0

  • streamtest: 队列名
  • cg1: 群组名称, 可随意指定
  • 0-0: 从头开始读

xgroup create streamtest cg2 $

  • $: 从结尾开始读, 只接受新消息, 老消息全部忽略

2. 查看队列详情

xinfo stream streamtest

3. 查看群组详情

xinfo groups streamtest

4. 群组消费

xreadgroup GROUP cg1 c1 count 1 block 0 streams streamtest >

“GROUP”属于关键字,“cg1”是消费组名称,“c1”是消费者名称,“count 1”指明了消费数量,> 号表示从当前消费组的 last_delivered_id 后面开始读, 每当消费者读取一条消息,last_delivered_id 变量就会前进

5. 查看群组消费情况

xinfo consumers streamtest cg1

可以看到目前 c1 这个消费者有7条待 ACK 的消息,空闲了 329273 ms 没有读取消息。

6. ack确认消息

xack streamtest cg1 1701659319318-0 1701659324617-0

消息确认完, pending消息7条变成5条

Redis几种队列实现

1. 基于List的LPUSH+BRPOP的实现

优点: 实现简单, 消息延迟几乎为0

缺点: 空闲连接问题, ack问题.

如果线程一直阻塞在那里,Redis 客户端的连接就成了闲置连接,闲置过久, 服务器一般会主动断开连接,减少闲置资源占用,这个时候 blpop 和 brpop 或抛 出异常,所以在编写客户端消费者的时候要小心,如果捕获到异常需要重试

2. 基于Sorted-Set 的实现

        多用来实现延迟队列,也可以实现有序的普通的消息队列,但是消费者无法阻塞的获取消息,只能轮询,不允许重复消息。

3. PUB/SUB,订阅/发布模式

优点典型的广播模式,一个消息可以发布到多个消费者;多信道订阅,消费者可 以同时订阅多个信道,从而接收多类消息;消息即时发送,消息不用等待消费者 读取,消费者会自动接收到信道发布的消息。

缺点:

  1. 消息一旦发布, 若客户端不在线, 消息就会丢失;
  2. 不能保证每个消费者接收的时间是一致的;
  3. 若消费者客户端出现消息 积压,到一定程度,会被强制断开,导致消息意外丢失。通常发生在消息的生产 远大于消费速度时.

由此可见,Pub/Sub 模式不适合做消息存储,消息积压类的业务, 而是擅长处理广播,即时通讯,即时反馈的业务

4. 基于Stream类型的实现

        已经有了一个消息中间件的雏形,可以考虑在生产过程中使用,当然真正要在生产中应用,要做的事情还很多,比如消息队列的管理和监控需要花大力气去实现,而专业消息队列都已经自带或者存在着很好的第三方方案和插件

这篇关于Redis5新特性-stream的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/454191

相关文章

ActiveMQ—消息特性(延迟和定时消息投递)

ActiveMQ消息特性:延迟和定时消息投递(Delay and Schedule Message Delivery) 转自:http://blog.csdn.net/kimmking/article/details/8443872 有时候我们不希望消息马上被broker投递出去,而是想要消息60秒以后发给消费者,或者我们想让消息没隔一定时间投递一次,一共投递指定的次数。。。 类似

PostgreSQL核心功能特性与使用领域及场景分析

PostgreSQL有什么优点? 开源和免费 PostgreSQL是一个开源的数据库管理系统,可以免费使用和修改。这降低了企业的成本,并为开发者提供了一个活跃的社区和丰富的资源。 高度兼容 PostgreSQL支持多种操作系统(如Linux、Windows、macOS等)和编程语言(如C、C++、Java、Python、Ruby等),并提供了多种接口(如JDBC、ODBC、ADO.NET等

详解Tomcat 7的七大新特性和新增功能(1)

http://developer.51cto.com/art/201009/228537.htm http://tomcat.apache.org/tomcat-7.0-doc/index.html  Apache发布首个Tomcat 7版本已经发布了有一段时间了,Tomcat 7引入了许多新功能,并对现有功能进行了增强。很多文章列出了Tomcat 7的新功能,但大多数并没有详细解释它们

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

JavaSE(十三)——函数式编程(Lambda表达式、方法引用、Stream流)

函数式编程 函数式编程 是 Java 8 引入的一个重要特性,它允许开发者以函数作为一等公民(first-class citizens)的方式编程,即函数可以作为参数传递给其他函数,也可以作为返回值。 这极大地提高了代码的可读性、可维护性和复用性。函数式编程的核心概念包括高阶函数、Lambda 表达式、函数式接口、流(Streams)和 Optional 类等。 函数式编程的核心是Lambda

《C++标准库》读书笔记/第一天(C++新特性(1))

C++11新特性(1) 以auto完成类型自动推导 auto i=42; //以auto声明的变量,其类型会根据其初值被自动推倒出来,因此一定需要一个初始化操作; static auto a=0.19;//可以用额外限定符修饰 vector<string> v;  auto pos=v.begin();//如果类型很长或类型表达式复杂 auto很有用; auto l=[] (int

12C 新特性,MOVE DATAFILE 在线移动 包括system, 附带改名 NID ,cdb_data_files视图坏了

ALTER DATABASE MOVE DATAFILE  可以改名 可以move file,全部一个命令。 resue 可以重用,keep好像不生效!!! system照移动不误-------- SQL> select file_name, status, online_status from dba_data_files where tablespace_name='SYSTEM'

Cmake之3.0版本重要特性及用法实例(十三)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧

Java8特性:分组、提取字段、去重、过滤、差集、交集

总结下自己使用过的特性 将对象集合根据某个字段分组 //根据id分组Map<String, List<Bean>> newMap = successCf.stream().collect(Collectors.groupingBy(b -> b.getId().trim())); 获取对象集合里面的某个字段的集合 List<Bean> list = new ArrayList<>

Java stream使用与执行原理

stream简介 Stream: A sequence of elements supporting sequential and parallel aggregate operations stream为sequential即单线程串行操作,parallelStream支持并行操作,本文只讨论sequential的stream。 stream常用操作 @Datastatic