# Stream命令

# XACK

# 语法

XACK key group id [id ...]

# 描述

XACK 命令用于从流(Stream)消费者组的待处理条目列表(PEL)中,移除一条或多条消息

# 参数

  • key

Stream 键

  • group

消费者组名称

  • id

需要确认(ACK)的一条或多条消息 ID

# 示例

> XACK mystream mygroup 1526569495631-0
(integer) 1

# XADD

# 语法

XADD key [NOMKSTREAM] [KEEPREF | DELREF | ACKED]
  [IDMPAUTO producer-id | IDMP producer-id idempotent-id]
  [<MAXLEN | MINID> [= | ~] threshold [LIMIT count]] <* | id>
  field value [field value ...]

# 描述

将指定的流条目追加到指定键的流中。如果该键不存在,XADD 会在执行命令时顺带创建一个新键,并写入这条流数据。如果你不想让它自动建键,可以加上 NOMKSTREAM 选项来关闭这个行为

# 参数

  • key

Stream 键

  • id

Stream条目的 ID。使用 * 可自动生成唯一 ID

  • field value

构成流条目(stream entry)的一个或多个字段-值对。您必须至少提供一个字段-值对

# 示例

> XADD mystream * name Sara surname OConnor
4378417975-0"
> XADD mystream * field1 value1 field2 value2 field3 value3
4378417976-0"
> XLEN mystream
eger) 2
> XRANGE mystream - +
1) 1) "1774378417975-0"
   2) 1) "name"
      2) "Sara"
      3) "surname"
      4) "OConnor"
2) 1) "1774378417976-0"
   2) 1) "field1"
      2) "value1"
      3) "field2"
      4) "value2"
      5) "field3"
      6) "value3"

> XADD mystream IDMP producer1 msg1 * field value
"1774378417976-0"
> XADD mystream IDMP producer1 msg1 * field different_value
"1774378417976-0"
> XADD mystream IDMPAUTO producer2 * field value
"1774378417977-0"
> XADD mystream IDMPAUTO producer2 * field value
"1774378417977-0"
> XCFGSET mystream IDMP-DURATION 300 IDMP-MAXSIZE 1000
"OK"


# XAUTOCLAIM

# 语法

XAUTOCLAIM key group consumer min-idle-time start [COUNT count]
  [JUSTID]

# 描述

该命令会将符合指定条件的、处于待处理状态的流条目转移所有权。从概念上讲,XAUTOCLAIM 相当于先调用 XPENDING 再调用 XCLAIM,但它提供了类似 SCAN 的语义,让处理消息投递失败的情况变得更加简单直接

# 参数

  • key

Stream 键

  • group

消费者组名称

  • consumer

将拥有已认领消息的消费者的名称

  • min-idle-time

仅认领空闲时间至少达到此时长(单位:毫秒)的消息。

  • start

开始扫描的起始消息 ID。传入 0 表示从 PEL 的开头开始

# 示例

> XAUTOCLAIM mystream mygroup Alice 3600000 0-0 COUNT 25
1) "0-0"
2) 1) 1) "1609338752495-0"
      2) 1) "field"
         2) "value"
3) (empty array)

# XCLAIM

# 语法

XCLAIM key group consumer min-idle-time id [id ...] [IDLE ms]
  [TIME unix-time-milliseconds] [RETRYCOUNT count] [FORCE] [JUSTID]
  [LASTID lastid]

# 描述

将存储在 key 的哈希中 field 字段的整数值增加 increment。如果 key 不存在,则创建一个保存哈希的新键。如果 field 不存在,则在执行操作前将其设置为 0。支持的整数范围限于 64 位有符号整数。

# 参数

  • key

保存stream的键名。

  • group

消费者组名称

  • consumer

将拥有已认领消息的消费者的名称

  • id

一个或多个待认领(/待确认/待处理)的消息 ID

# 示例

> XCLAIM mystream mygroup Alice 3600000 1526569498055-0
1) 1) 1526569498055-0
   2) 1) "message"
      2) "orange"

# XDEL

# 语法

XDEL key id [id ...]

# 描述

从stream中移除指定的条目,并返回被删除的条目数量。如果指定的某些 ID 在流中并不存在,那么返回的删除数量可能会少于传入命令的 ID 数量

# 参数

  • key

Stream键的名称。

  • id

一个或多个待认领(/待确认/待处理)的消息 ID

# 示例

> XADD mystream * a 1
1538561698944-0
> XADD mystream * b 2
1538561700640-0
> XADD mystream * c 3
1538561701744-0
> XDEL mystream 1538561700640-0
(integer) 1
127.0.0.1:6379> XRANGE mystream - +
1) 1) 1538561698944-0
   2) 1) "a"
      2) "1"
2) 1) 1538561701744-0
   2) 1) "c"
      2) "3"

# XGROUP CREATE

# 语法

XGROUP CREATE key group <id | $> [MKSTREAM]
  [ENTRIESREAD entries-read]

# 描述

为 key 对应的流创建一个新的消费者组,使用 groupname 作为唯一标识

# 参数

  • key

    存储stream的键名。

  • group

消费者组名称

  • id | $

该组在读取时,从这条已投递消息的 ID 之后开始。如果想从流中当前的最后一条消息开始,可以使用 $


# XGROUP CREATECONSUMER

# 语法

XGROUP CREATECONSUMER key group consumer

# 描述

在存储于指定键的流中,于消费者组 groupname 下创建一个名为 consumername 的消费者。

# 参数

  • key

Stream键的名称。该流必须已经存在

  • group

消费者组名称

  • consumer

将拥有已认领消息的消费者的名称


# XGROUP DELCONSUMER

# 语法

XGROUP DELCONSUMER key group consumer

# 描述

XGROUP DELCONSUMER 命令用于从消费者组中删除一个消费者

# 参数

  • key

Stream键的名称。该流必须已经存在

  • group

消费者组名称

  • consumer

将拥有已认领消息的消费者的名称


# XGROUP DESTROY

# 语法

XGROUP DESTROY key group

# 描述

XGROUP DESTROY 命令会彻底销毁一个消费者组。

# 参数

  • key

Stream键的名称。该流必须已经存在

  • group

消费者组名称


# XGROUP SETID

# 语法

XGROUP SETID key group <id | $> [ENTRIESREAD entries-read]

# 描述

为消费组设置最后已投递的 ID

# 参数

  • key

Stream键的名称。该流必须已经存在

  • group

消费者组名称

  • id | $

用于设置为该群组最后已投递的 ID。使用 $ 代表当前stream中的最后一条消息,或使用 0 重置到起始位置


# XINFO CONSUMERS

# 语法

XINFO CONSUMERS key group

# 描述

该命令会返回指定 key 下,属于 groupname 消费者组的所有消费者列表

# 参数

  • key

Stream键的名称。该流必须已经存在

  • group

消费者组名称

# 示例

> XINFO CONSUMERS mystream mygroup
1) 1) name
   2) "Alice"
   3) pending
   4) (integer) 1
   5) idle
   6) (integer) 9104628
   7) inactive
   8) (integer) 18104698
2) 1) name
   2) "Bob"
   3) pending
   4) (integer) 1
   5) idle
   6) (integer) 83841983
   7) inactive
   8) (integer) 993841998

# XINFO GROUP

# 语法

XINFO GROUPS key

# 描述

该命令会返回存储在指定 key 中的stream的所有消费者组列表

# 参数

  • key

Stream键的名称

# 示例

> XINFO GROUPS mystream
1)  1) "name"
    2) "mygroup"
    3) "consumers"
    4) (integer) 2
    5) "pending"
    6) (integer) 2
    7) "last-delivered-id"
    8) "1638126030001-0"
    9) "entries-read"
   10) (integer) 2
   11) "lag"
   12) (integer) 0
2)  1) "name"
    2) "some-other-group"
    3) "consumers"
    4) (integer) 1
    5) "pending"
    6) (integer) 0
    7) "last-delivered-id"
    8) "1638126028070-0"
    9) "entries-read"
   10) (integer) 1
   11) "lag"
   12) (integer) 1

# XINFO STREAM

# 语法

XINFO STREAM key [FULL [COUNT count]]

# 描述

该命令会返回存储在指定 key中stream的相关信息

# 参数

  • key

    stream键的名称

  • FULL

开始扫描的起始消息 ID。传入 0 表示从 PEL 的开头开始

  • COUNT

指定要返回的条目数量。设为 0 会返回所有条目;默认值为 10

# 示例

> XADD mystream * message apple
"1638125133432-0"
> XADD mystream * message banana
"1638125141232-0"
> XCFGSET mystream DURATION 100 MAXSIZE 100
OK
> XADD mystream IDMP producer1 msg1 * field value
"1638125150000-0"

> XINFO STREAM mystream
 1) "length"
 2) (integer) 2
 3) "radix-tree-keys"
 4) (integer) 1
 5) "radix-tree-nodes"
 6) (integer) 2
 7) "last-generated-id"
 8) "1638125141232-0"
 9) "max-deleted-entry-id"
10) "0-0"
11) "entries-added"
12) (integer) 2
13) "recorded-first-entry-id"
14) "1719505260513-0"
15) "idmp-duration"
16) (integer) 100
17) "idmp-maxsize"
18) (integer) 100
19) "pids-tracked"
20) (integer) 1
21) "iids-tracked"
22) (integer) 1
23) "iids-added"
24) (integer) 1
25) "iids-duplicates"
26) (integer) 0
27) "groups"
28) (integer) 1
29) "first-entry"
30) 1) "1638125133432-0"
    2) 1) "message"
       2) "apple"
31) "last-entry"
32) 1) "1638125141232-0"
    2) 1) "message"
       2) "banana"

> XADD mystream * foo bar
"1638125133432-0"
> XADD mystream * foo bar2
"1638125141232-0"
> XGROUP CREATE mystream mygroup 0-0
OK
> XREADGROUP GROUP mygroup Alice COUNT 1 STREAMS mystream >
1) 1) "mystream"
   2) 1) 1) "1638125133432-0"
         2) 1) "foo"
            2) "bar"
> XINFO STREAM mystream FULL
 1) "length"
 2) (integer) 2
 3) "radix-tree-keys"
 4) (integer) 1
 5) "radix-tree-nodes"
 6) (integer) 2
 7) "last-generated-id"
 8) "1638125141232-0"
 9) "max-deleted-entry-id"
10) "0-0"
11) "entries-added"
12) (integer) 2
13) "recorded-first-entry-id"
14) "1719505260513-0"
15) "entries"
16) 1) 1) "1638125133432-0"
       2) 1) "foo"
          2) "bar"
    2) 1) "1638125141232-0"
       2) 1) "foo"
          2) "bar2"
17) "groups"
18) 1)  1) "name"
        2) "mygroup"
        3) "last-delivered-id"
        4) "1638125133432-0"
        5) "entries-read"
        6) (integer) 1
        7) "lag"
        8) (integer) 1
        9) "pel-count"
       10) (integer) 1
       11) "pending"
       12) 1) 1) "1638125133432-0"
              2) "Alice"
              3) (integer) 1638125153423
              4) (integer) 1
       13) "consumers"
       14) 1) 1) "name"
              2) "Alice"
              3) "seen-time"
              4) (integer) 1638125133422
              5) "active-time"
              6) (integer) 1638125133432
              7) "pel-count"
              8) (integer) 1
              9) "pending"
              10) 1) 1) "1638125133432-0"
                     2) (integer) 1638125133432
                     3) (integer) 1

# XINFO

# 语法

XINFO

# 描述

这是一个用于流内省命令的容器命令


# XLEN

# 语法

XLEN key

# 描述

返回流(Stream)内部的条目数量。如果指定的key不存在,命令会返回零,因此,如果想确认一个键到底存不存在,应该使用 TYPE 或 EXISTS 命令来进行检查。

# 参数

  • key

Stream键的名称。

# 示例

> XADD mystream * item 1
"1782978888016-0"
> XADD mystream * item 2
"1782978888017-0"
> XADD mystream * item 3
"1782978888018-0"
> XLEN mystream
(integer) 3

# XPENDING

# 语法

XPENDING key group [[IDLE min-idle-time] start end count [consumer]]

# 描述

XPENDING 命令用于查看待处理消息的列表。因此,它是观察和了解Stream消费者组运行状态的一个非常重要的命令,比如:哪些客户端处于活跃状态、哪些消息正在等待被消费

# 参数

  • key

Stream键的名称

  • group

消费者组名称

  • consumer

将拥有已认领消息的消费者的名称

# 示例

> XGROUP CREATE mystream group55 0-0
OK

> XREADGROUP GROUP group55 consumer-123 COUNT 1 STREAMS mystream >
1) 1) "mystream"
   2) 1) 1) 1526984818136-0
         2) 1) "duration"
            2) "1532"
            3) "event-id"
            4) "5"
            5) "user-id"
            6) "7782813"

> XPENDING mystream group55
1) (integer) 1
2) 1526984818136-0
3) 1526984818136-0
4) 1) 1) "consumer-123"
      2) "1"

# XRANGE

# 语法

XRANGE key start end [COUNT count]

# 描述

该命令会返回匹配指定 ID 范围的流(stream)条目。范围由一个最小 ID 和一个最大 ID 来确定。所有 ID 介于这两个值之间,或者正好等于其中某个指定 ID 的条目都会被返回

# 参数

  • key

Stream键的名称

  • start

开始扫描的起始消息 ID。传入 0 表示从 PEL 的开头开始

  • COUNT

要返回的最大条目数

# 示例

> XADD writers * name Virginia surname Woolf
"1782980069463-0"
> XADD writers * name Jane surname Austen
"1782980069464-0"
> XADD writers * name Toni surname Morrison
"1782980069464-1"
> XADD writers * name Agatha surname Christie
"1782980069464-2"
> XADD writers * name Ngozi surname Adichie
"1782980069465-0"
> XLEN writers
(integer) 5
> XRANGE writers - + COUNT 2
1) 1) "1782980069463-0"
   2) 1) "name"
      2) "Virginia"
      3) "surname"
      4) "Woolf"
2) 1) "1782980069464-0"
   2) 1) "name"
      2) "Jane"
      3) "surname"
      4) "Austen"

# XREAD

# 语法

XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id
  [id ...]```

#### 描述

从单个或多个stream中读取数据,且只返回那些 ID 大于调用者上次接收到的 ID 的条目。如果当前没有可用的数据,该命令还提供了一个阻塞选项,其工作方式与 BRPOP、BZPOPMIN 等命令类似

#### 参数

- **COUNT**

指定要返回的条目数量。设为 0 会返回所有条目;默认值为 10

- **STREAMS key**

需要读取的键,后面紧跟每个键对应的 ID。对于每个stream,将返回 ID 大于给定 ID 的条目。如果传入 $,则只会读取在调用该命令之后新增的条目


#### 示例

```bash
> XREAD COUNT 2 STREAMS mystream writers 0-0 0-0
1) 1) "mystream"
   2) 1) 1) 1526984818136-0
         2) 1) "duration"
            2) "1532"
            3) "event-id"
            4) "5"
            5) "user-id"
            6) "7782813"
      2) 1) 1526999352406-0
         2) 1) "duration"
            2) "812"
            3) "event-id"
            4) "9"
            5) "user-id"
            6) "388234"
2) 1) "writers"
   2) 1) 1) 1526985676425-0
         2) 1) "name"
            2) "Virginia"
            3) "surname"
            4) "Woolf"
      2) 1) 1526985685298-0
         2) 1) "name"
            2) "Jane"
            3) "surname"
            4) "Austen"

STREAMS key_1 key_2 key_3 ... key_N ID_1 ID_2 ID_3 ... ID_N

> XREAD COUNT 2 STREAMS mystream writers 1526999352406-0 1526985685298-0
1) 1) "mystream"
   2) 1) 1) 1526999626221-0
         2) 1) "duration"
            2) "911"
            3) "event-id"
            4) "7"
            5) "user-id"
            6) "9488232"
2) 1) "writers"
   2) 1) 1) 1526985691746-0
         2) 1) "name"
            2) "Toni"
            3) "surname"
            4) "Morrison"
      2) 1) 1526985712947-0
         2) 1) "name"
            2) "Agatha"
            3) "surname"
            4) "Christie"


# XREADGROUP

# 语法

XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds]
  [CLAIM min-idle-time] [NOACK] STREAMS key [key ...] id [id ...]

# 描述

XREADGROUP 命令是 XREAD 命令的一个特殊版本,增加了对消费者组的支持

# 参数

  • STREAMS key

需要读取的键,后面紧跟每个键对应的 ID。对于每个stream,将返回 ID 大于给定 ID 的条目。如果传入 $,则只会读取在调用该命令之后新增的条目

  • GROUP consumer

要读取的消费者组和消费者名称

# 示例

WHILE true
    entries = XREADGROUP GROUP $GroupName $ConsumerName BLOCK 2000 COUNT 10 STREAMS mystream >
    if entries == nil
        puts "Timeout... try again"
        CONTINUE
    end

    FOREACH entries AS stream_entries
        FOREACH stream_entries as message
            process_message(message.id,message.fields)

            # ACK the message as processed
            XACK mystream $GroupName message.id
        END
    END
END


# XREVRANGE

# 语法

XREVRANGE key end start [COUNT count]

# 描述

该命令的作用与 XRANGE 类似,但返回的条目是逆序的。使用时需要先指定结束 ID,再指定起始 ID。XREVRANGE 会返回这两个 ID 之间(包含这两个 ID)的条目,并且从范围的尾部开始返回

# 参数

  • key

Stream键的名称

  • start

开始扫描的起始消息 ID。传入 0 表示从 PEL 的开头开始

  • end

ID 范围的结束值(包含该 ID)。返回的条目是逆序的。使用 + 代表最大的 ID

  • COUNT

要返回的最大条目数

# 示例

> XADD writers * name Virginia surname Woolf
"1782981076345-0"
> XADD writers * name Jane surname Austen
"1782981076346-0"
> XADD writers * name Toni surname Morrison
"1782981076347-0"
> XADD writers * name Agatha surname Christie
"1782981076348-0"
> XADD writers * name Ngozi surname Adichie
"1782981076348-1"
> XLEN writers
(integer) 5
> XREVRANGE writers + - COUNT 1
1) 1) "1782981076348-1"
   2) 1) "name"
      2) "Ngozi"
      3) "surname"
      4) "Adichie"


# XSETID

# 语法

XSETID key last-id [ENTRIESADDED entries-added]
  [MAXDELETEDID max-deleted-id]

# 描述

XSETID 是一个内部命令,用户不应直接调用它

# 参数

  • key

Stream键的名称

  • end

ID 范围的结束值(包含该 ID)


---

## XTRIM

#### 语法

```bash
XTRIM key <MAXLEN | MINID> [= | ~] threshold [LIMIT count] [KEEPREF | DELREF | ACKED]

# 描述

如果需要,XTRIM 会通过淘汰较旧的条目(即 ID 较小的条目)来截断Stream

# 参数

  • key

Stream键的名称

# 示例

> XADD mystream * field1 A field2 B field3 C field4 D
"1782981471050-0"
> XTRIM mystream MAXLEN 2
(integer) 0
> XRANGE mystream - +
1) 1) "1782981471050-0"
   2) 1) "field1"
      2) "A"
      3) "field2"
      4) "B"
      5) "field3"
      6) "C"
      7) "field4"
      8) "D"