Redis Stream 基础命令介绍

Redis Stream 基础命令介绍

Stream是在5.0版本之后才有的数据结构,是目前最复杂的数据结构。

xadd

127.0.0.1:6379[1]> xadd test * firstName Guanjie lastName Cao
"1578117062045-0"

向名称为test的stream中添加一个entry,添加的数据写成json格式的话就是:

{
    "firstName" : "Guanjie",
    "lastName"  : "Cao"
}

*的意思是自动生成id,也可以自己手动指定。自动生成的id格式为<millisecondsTime>-<sequenceNumber>

xlen

127.0.0.1:6379[1]> xlen test
(integer) 1

获取指定stream中item的个数

xrange

查询指定范围内的entry

127.0.0.1:6379[1]> xrange test - +
1) 1) "1578117062045-0"
   2) 1) "firstName"
      2) "Guanjie"
      3) "lastName"
      4) "Cao"
2) 1) "1578117786836-0"
   2) 1) "first"
      2) "Math"
3) 1) "1578117801154-0"
   2) 1) "second"
      2) "English"

起始指定为- +表示查询所有的,相应的可以把这两个换成时间,例如

127.0.0.1:6379[1]> xrange test 1578117062045-0 1578117801154-0 count 2
1) 1) "1578117062045-0"
   2) 1) "firstName"
      2) "Guanjie"
      3) "lastName"
      4) "Cao"
2) 1) "1578117786836-0"
   2) 1) "first"
      2) "Math"

后面的count 2 表示只取两个

xrevrange

127.0.0.1:6379[1]> xrevrange test + - count 1
1) 1) "1578117801154-0"
   2) 1) "second"
      2) "English"

xrevrange和xrange的作用类似,不同之处是:

  1. xrevrange要先指定的范围按照end begin来输入
  2. xrevrange是按照倒序输出的

xread

xread用来监听新的entry进来。Stream中xread和和blocking list,sub/pub模型的不同之处在于

  1. 一个stream对应多个client,每个进xread的client都可以接收到新的entry。这个是和blocking list的区别,然而和sub/pub模型是类似的
  2. sub/pub模型中消息一旦被消费就会被丢弃掉,Stream中的被消费了会继续存在来(除非用户主动删除)
  3. stream中有group的概念,一个stream可以有多个group,一个group可以有多个client。group可查看当前正在处理的消息、已经处理的消息、未处理的消息和每个client处理的历史消息
  4. xread可以监听多个stream
27.0.0.1:6379[1]> xread count 1 block 0  streams test $
1) 1) "test"
   2) 1) 1) "1578124142858-0"
         2) 1) "third"
            2) "animal"
(79.12s)

以阻塞的方式接受消息,接受最新的消息。xread的命令格式为:

xread [COUNT count] [block milliseconds] streams key [key ...] id [id ...]
  • count 指定要获取的个数
  • block 不写的话直接读,读不到就返回空。指定了的话就在指定时间内读取count条记录,如果。milliseconds为0表示一直等待
  • id 读取的记录id都是大于指定id的,$表示使用stream中最新消息的id

xgroup

创建、删除、管理group,命令格式为:

xgroup [create key groupName id-or-$] [setid key id-or-$] [destroy key groupName] [delconsumer key groupName consumerName]
127.0.0.1:6379[1]> XGROUP create test cgj $
OK

xreadgroup

consumer读取消息进行消费,xreadgroup的命令格式为:

xreadgroup group groupName consumerName [COUNT count] [BLOCK milliseconds] streams key [key ...] id [id ...]
127.0.0.1:6379[1]> xreadgroup group g1 myt streams test >
1) 1) "test"
   2) 1) 1) "1578126609985-0"
         2) 1) "msg"
            2) "hello"
      2) 1) "1578126615915-0"
         2) 1) "msg"
            2) "caoguanjie"
      3) 1) "1578127264192-0"
         2) 1) "msg"
            2) "world"
127.0.0.1:6379[1]> xreadgroup group g1 myt streams test 1578126615915-0
1) 1) "test"
   2) 1) 1) "1578127264192-0"
         2) 1) "msg"
            2) "world"

# 以永久阻塞的方式来读取1个从未分发给其他consumer的消息
127.0.0.1:6379[1]> xreadgroup group g1 myt count 1 block 0  streams test >
1) 1) "test"
   2) 1) 1) "1578127730231-0"
         2) 1) "msg"
            2) "welcome"
(11.56s)

# 获取所有还没有ack的消息
127.0.0.1:6379[1]> xreadgroup group g1 myt streams test 0
1) 1) "test"
   2) 1) 1) "1578126609985-0"
         2) 1) "msg"
            2) "hello"
      2) 1) "1578126615915-0"
         2) 1) "msg"
            2) "caoguanjie"
      3) 1) "1578127264192-0"
         2) 1) "msg"
            2) "world"
      4) 1) "1578127730231-0"
         2) 1) "msg"
            2) "welcome"
  • > 这个id有特殊的含义,表示读取从来没有分给别的consumer的消息
  • id如果是一个合法的id就就会获取该consumer的pending message。pending message 就是已经获取到,但是还没来得及ack的信息

ack

consumer通过ack来告诉group自己已经成功处理了消息,之后就不能从该consumer的pending message中看到对应的消息。命令格式为:

xack key groupName id [id ...]
27.0.0.1:6379[1]> xreadgroup group g1 myt streams test 0
1) 1) "test"
   2) 1) 1) "1578126609985-0"
         2) 1) "msg"
            2) "hello"
      2) 1) "1578126615915-0"
         2) 1) "msg"
            2) "caoguanjie"
      3) 1) "1578127264192-0"
         2) 1) "msg"
            2) "world"
      4) 1) "1578127730231-0"
         2) 1) "msg"
            2) "welcome"
127.0.0.1:6379[1]> xack test g1 1578126609985-0 1578126615915-0
(integer) 2
127.0.0.1:6379[1]> xreadgroup group g1 myt streams test 0
1) 1) "test"
   2) 1) 1) "1578127264192-0"
         2) 1) "msg"
            2) "world"
      2) 1) "1578127730231-0"
         2) 1) "msg"
            2) "welcome"

TIP

  • consumer会自动创建,不用专门去创建
  • xreadgroup可以同时从多个stream中获取消息,需要保证对应的stream中有创建相同的group
  • xreadgroup是一个写命令,因为他在读取的同时已经修改了consumer group的状态
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值