Redis精通系列——Stream,Java开发笔试题大全带答案

目录

1、简介

2、Stream内部探索

2.1 Stream 结构

2.2 四个唯一

2.3 消息ID

2.4 消息内容

3、Stream指令

3.1 指令汇总

3.2 XADD

3.2 XTRIM

3.3 XDEL

3.4 XLEN

3.5 XRANGE

3.6 XREVRANGE

3.7 XREAD

3.8 XGROUP CREATE

3.9 XREADGROUP GROUP

3.10 XACK

3.11 XPENDING

3.11 XCLAIM

3.13 XINFO

4、关于Stream优化内存的事情


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结构图:

stream.png

如下是关于上图的名词解析:

  • Message Content:消息内容

  • Consumer group:消费组,通过XGROUP CREATE 命令创建,一个消费组可以有多个消费者

  • Last_delivered_id:游标,每个消费组有一个游标,任意消费者读取消息后,游标都会向前移动

  • Consumer:消费者,消费组中的消费者

  • Pending_ids:状态变量,每个消费者会有一个状态变量,用于记录被当前消费者读取,但是并未ack的消息id

2.2 四个唯一

Stream内部维护了一个消息链表,以此使得消息能够具有队列的特性。在Stream中有四个唯一需要了解:

  1. 每个Stream都具有唯一的名称

  2. 每个消息(Message)都具有一个由系统分配或者客户端指定唯一ID

  3. 每个Stream中的消费组(Consumer_Group)具有唯一名称

  4. 每个消费组(Consumer_Group)中的消费者(Consumer)具有唯一名称

2.3 消息ID

Stream的消息ID可以由服务端自动生成,也可以由客户端传入,如下图是自动生成的结构:

image.png

系统自动生成的规则

-

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。

image.png

3.2 XTRIM

XTRIM 用于对Stream的长度进行限定。

XTRIM 的指令语法:

XTRIM key MAXLEN|MINID [=|~] threshold [LIMIT count]

  • MAXLEN 允许的最大长度,如果长度超出则会抛弃队列前面的消息

  • MINID 允许的最小id,从某个id值开始保留,其余的将会被抛弃

image.png

3.3 XDEL

XDEL 用于删除消息。

XDEL 的指令语法:

XDEL key ID [ID …]

image.png

3.4 XLEN

XLEN 用于获取Stream 队列的消息的长度。

XLEN 的指令语法:

XLEN key

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

由于篇幅原因,就不多做展示了
节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-ywa9an4v-1711718026620)]

最后

[外链图片转存中…(img-JujrWZPv-1711718026620)]

[外链图片转存中…(img-njjaXGr5-1711718026621)]

[外链图片转存中…(img-hyIQvR2q-1711718026621)]

[外链图片转存中…(img-FzqDQQM8-1711718026622)]

[外链图片转存中…(img-aSh3RBeO-1711718026622)]

[外链图片转存中…(img-94TCahNB-1711718026622)]

由于篇幅原因,就不多做展示了

  • 29
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值