目录
1、简介
Stream弥补了Redis作为MQ(message queue)技术选型上的不足之处;Redis 5.0发布的Stream相比Pub/Sub模块,Stream支持消息持久化,结合sentinel或cluster使其成为了一个比较可靠的消息队列。尽管我认为它很难成为公司MQ的技术选型产品,但是关于Stream的使用和特性(消费组),仍值得一探究竟。
Stream对标消息队列,因此几乎具备了MQ所有的特性,以下列出Stream所具有的部分特性:
-
消息顺序存储
-
消息ID序列化规则生成
-
消息的遍历
-
消息阻塞/非阻塞式获取
-
客户端分组消费消息
-
消息确认机制
-
消息异常机制
-
消息队列监控
在文中也会说到Stream的这些特性。
2、Stream内部探索
2.1 Stream 结构
在探索Stream的内部结构之前,先看一张清晰的Stream结构图:
如下是关于上图的名词解析:
-
Message Content:消息内容
-
Consumer group:消费组,通过XGROUP CREATE 命令创建,一个消费组可以有多个消费者
-
Last_delivered_id:游标,每个消费组有一个游标,任意消费者读取消息后,游标都会向前移动
-
Consumer:消费者,消费组中的消费者
-
Pending_ids:状态变量,每个消费者会有一个状态变量,用于记录被当前消费者读取,但是并未ack的消息id
2.2 四个唯一
Stream内部维护了一个消息链表,以此使得消息能够具有队列的特性。在Stream中有四个唯一需要了解:
-
每个Stream都具有唯一的名称
-
每个消息(Message)都具有一个由系统分配或者客户端指定唯一ID
-
每个Stream中的消费组(Consumer_Group)具有唯一名称
-
每个消费组(Consumer_Group)中的消费者(Consumer)具有唯一名称
2.3 消息ID
Stream的消息ID可以由服务端自动生成,也可以由客户端传入,如下图是自动生成的结构:
系统自动生成的规则
-
millisecondsTime指的是Redis节点服务器的本地时间,如果存在当前的毫秒时间戳比以前已经存在的数据的时间戳小的话(本地时间钟后跳),那么系统将会采用以前相同的毫秒创建新的ID。
sequenceNumber指的是序列号,在相同的millisecondsTime毫秒下,序列号从0开始递增,序列号是64位长度,理论上在统一毫秒内生成的数据量无法到达这个级别,因此不用担心sequenceNumber会不够用。
客户端显示传入规则
Redis对于ID有强制要求,格式必须是**-**,最小ID为0-1,并且后续ID不能小于前一个ID
2.4 消息内容
Stream的消息内容,也就是图中的Message Content它的结构类似Hash结构,以key-value的形式存在。
3、Stream指令
3.1 指令汇总
Stream的指令根据可以分为两类,分别是消息队列相关指令,消费组相关指令。
消息队列相关指令:
| 指令名称 | 指令作用 |
| — | — |
| XADD | 添加消息到队列末尾 |
| XTRIM | 限制Stream的长度,如果已经超长会进行截取 |
| XDEL | 删除消息 |
| XLEN | 获取Stream中的消息长度 |
| XRANGE | 获取消息列表(可以指定范围),忽略删除的消息 |
| XREVRANGE | 和XRANGE相比区别在于反向获取,ID从大到小 |
| XREAD | 获取消息(阻塞/非阻塞),返回大于指定ID的消息 |
消费组相关指令:
| 指令名称 | 指令作用 |
| — | — |
| XGROUP CREATE | 创建消费者组 |
| XREADGROUP GROUP | 读取消费者组中的消息 |
| XACK | ack消息,消息被标记为“已处理” |
| XGROUP SETID | 设置消费者组最后递送消息的ID |
| XGROUP DELCONSUMER | 删除消费者组 |
| XPENDING | 打印待处理消息的详细信息 |
| XCLAIM | 转移消息的归属权(长期未被处理/无法处理的消息,转交给其他消费者组进行处理) |
| XINFO | 打印Stream\Consumer\Group的详细信息 |
| XINFO GROUPS | 打印消费者组的详细信息 |
| XINFO STREAM | 打印Stream的详细信息 |
3.2 XADD
XADD 用于向Stream 队列中添加消息,如果指定的Stream 队列不存在,则该命令执行时会新建一个Stream 队列。
XADD的指令语法:
XADD key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] *|ID field value [field value …]
如下通过XADD展示了定义ID的两种方式,具体可以看2.3。
3.2 XTRIM
XTRIM 用于对Stream的长度进行限定。
XTRIM 的指令语法:
XTRIM key MAXLEN|MINID [=|~] threshold [LIMIT count]
-
MAXLEN 允许的最大长度,如果长度超出则会抛弃队列前面的消息
-
MINID 允许的最小id,从某个id值开始保留,其余的将会被抛弃
3.3 XDEL
XDEL 用于删除消息。
XDEL 的指令语法:
XDEL key ID [ID …]
3.4 XLEN
XLEN 用于获取Stream 队列的消息的长度。
XLEN 的指令语法:
XLEN key
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后
由于篇幅原因,就不多做展示了
节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-ywa9an4v-1711718026620)]
最后
[外链图片转存中…(img-JujrWZPv-1711718026620)]
[外链图片转存中…(img-njjaXGr5-1711718026621)]
[外链图片转存中…(img-hyIQvR2q-1711718026621)]
[外链图片转存中…(img-FzqDQQM8-1711718026622)]
[外链图片转存中…(img-aSh3RBeO-1711718026622)]
[外链图片转存中…(img-94TCahNB-1711718026622)]
由于篇幅原因,就不多做展示了