目录
一、Stream类型的使用
1.1、四个特殊符号
1.2、队列相关指令
1.2.1、xadd
1.2.2、xrange
1.2.3、xrevrange
1.2.4、xdel
1.2.5、xlen
1.2.6、xtrim
1.2.7、xread
1.3、消费组相关指令
1.3.1、xgroup create
1.3.2、xreadgroup group
1.3.2、xpending
1.3.3、xack
1.3.4、xinfo
1、- + :最小和最大可能出现的id
2、$:表示只消费新的消息,当前流中最大的id,可用于将要到来的信息。
3、>:用于xreadgroup命令,表示迄今还没有发送给组中使用者的信息,会更新消费者组的最后id
4、*:用于xadd命令中,让系统自动生产id
添加消息到队列末尾:①、消息id必须要比上个id大。②、默认用星号表示自动生成规则。
127.0.0.1:6379> xadd mystream * id 100 name ya1
1680532830663-0
127.0.0.1:6379> xadd mystream * id 110 name ya2
1680532843597-0
XADD用于向stream队列中添加消息,如果指定的stream队列不存在,则该命令执行时会新建一个stream队列。
信息条目指序列号,在相同的毫秒下序列号从0开始递增,序列号是64位长度,理论上在同一毫秒内生成的数据量无法达到这个级别,因此不用担心序列号不够用。milisecondsTime指redis节点服务器的本地时间,如果存在当前的毫秒时间戳比以前已经存在的数据的时间戳小的话(本地时间钟后跳),那么系统将会采用以前相同的毫秒创建新的id,即redis在增加消息条目时会检查当前id与上一条目的id,自动纠错的情况,一定要保证后面的id比前面大,一个流中信息条目的id必须是单调增的,这是流的基础。
客户端显示传入规则:redis对于id有强制要求,格式必须是时间戳-自增id这样的方式,且后续id不能小于前一个id。
stream的消息内容,Message Content它的结构类似Hash结构,以key-value的形式存在。
用于获取消息列表(可以指定范围),忽视删除的信息 :①、start表示开始值,-代表最小值。②、end:结束值,+代表最大值。③、count:最多获取多少值。
127.0.0.1:6379> xrange mystream - +
1680532830663-0
id
100
name
ya1
1680532843597-0
id
110
name
ya2
127.0.0.1:6379> xrange mystream - + count 1
1680532830663-0
id
100
name
ya1
127.0.0.1:6379> xrevrange mystream + -
1680532843597-0
id
110
name
ya2
1680532830663-0
id
100
name
ya1
127.0.0.1:6379> xdel mystream 1680532830663-0
1
127.0.0.1:6379> xrevrange mystream + -
1680532843597-0
id
110
name
ya2
用于获取stream队列的消息的长度。
127.0.0.1:6379> xlen mystream
1
用于对stream的长度进行截取,如超长会进行截取。
①、maxlen:允许的最大长度,对流进行修剪限制长度
②、minid:允许的最小id,从某个id值开始比该id值小的将会被抛弃。
用于获取消息(阻塞/非阻塞),只会返回大于指定id的消息。
非阻塞:
127.0.0.1:6379> xread count 1 streams mystream $
127.0.0.1:6379> xread count 1 streams mystream 0-0
mystream
1680536136650-0
id
130
name
ya4
阻塞:
stream的基础方法,使用xadd存入消息和xread循环阻塞读取消息的方式可以实现简易版的消息队列
用于创建消费者组
$:表示从stream尾部开始消费
0:表示从stream头部开始消费
">"表示从第一条尚未被消费的消息开始读取
消费组的目的:让组内的多个消费者共同分担读取信息,所以,通常会让每个消费者读取部分消息,从而实现消息读取负载在多个消费者间是均衡分布的。
基于stream实现的消息队列,如何保证消费者在发生故障或宕机再次重启后,仍然可以读取未处理完的消息?
1、stream会自动使用内部消息队列(PENDING List)留存消费组里每个消费者读取的消息保底措施,直到消费者使用XACK命令通知stream“消息已经处理完成”。
2、消费确认增加了消息可靠性,一般在业务处理完成后,需要执行XACK命令确认消息已经被消费完成了。
①、查询每个消费组内所有消费者(已读取、但尚未确认)的消息。
②、查看某个消费者具体读取了那些数据。
向消息队列确认消息处理已完成
打印stream\consumer\group的详细信息
127.0.0.1:6379> xinfo stream mystream
1) "length"
2) (integer) 4
3) "radix-tree-keys"
4) (integer) 1
5) "radix-tree-nodes"
6) (integer) 2
7) "last-generated-id"
8) "1680537770770-0"
9) "max-deleted-entry-id"
10) "1680532830663-0"
11) "entries-added"
12) (integer) 7
13) "recorded-first-entry-id"
14) "1680536136650-0"
15) "groups"
16) (integer) 5
17) "first-entry"
18) 1) "1680536136650-0"
2) 1) "id"
2) "130"
3) "name"
4) "ya4"
19) "last-entry"
20) 1) "1680537770770-0"
2) 1) "id"
2) "160"
3) "name"
4) "ya7"