*Redis XGROUP CREATE 命令

XGROUP CREATE 用于为 Stream 创建一个新的消费组,定义消费者共同消费消息的起始点。


*语法

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

*参数说明

参数 类型 必填 说明
key String Stream 键名
group String 消费组名称(同一 Stream 内唯一)
id / $ String 起始 ID;$ 表示从最后一条开始,0 表示从头开始
MKSTREAM Flag Stream 不存在时自动创建空 Stream
ENTRIESREAD Integer 设置逻辑读计数器(用于 lag 追踪,Redis 7.0+)

*返回值

  • OK:消费组创建成功
  • Error:参数错误、BUSYGROUP(组已存在)、key 不是 Stream 等

*时间复杂度

O(1)

*

*示例

*从头开始消费

> XADD mystream * field1 value1
"1638125000000-0"
> XGROUP CREATE mystream mygroup 0
OK
> XREADGROUP GROUP mygroup Alice COUNT 1 STREAMS mystream >
1) 1) "mystream"
   2) 1) 1) "1638125000000-0"
      2) 1) "field1"
         2) "value1"

*从最新消息开始(仅消费创建后新增的消息)

> XGROUP CREATE mystream mygroup $
OK
> XREADGROUP GROUP mygroup Bob COUNT 1 STREAMS mystream >
1) 1) "mystream"
   2) (empty array)
> XADD mystream * newmsg hello
"1638126000000-0"
> XREADGROUP GROUP mygroup Bob COUNT 1 STREAMS mystream >
1) 1) "mystream"
   2) 1) 1) "1638126000000-0"
      2) 1) "newmsg"
         2) "hello"

*自动创建 Stream

> XGROUP CREATE newstream mygroup $ MKSTREAM
OK
> XLEN newstream
(integer) 0

*常见错误

错误 原因 解决
BUSYGROUP 同名消费组已存在 使用唯一名称或先删除旧组
ERR no such key Stream 不存在且未加 MKSTREAM 创建 Stream 或添加 MKSTREAM
WRONGTYPE key 不是 Stream 类型 确认 key 的数据类型

*最佳实践

  • 组名建议包含业务语义,如 order-processorsemail-senders
  • 新消费者首次上线时,根据需求选择 0(全量)或 $(增量)
  • 使用 MKSTREAM 避免 Stream 不存在时的初始化失败
  • 同一消费组内的消费者通过 XREADGROUP 自动竞争消息,天然实现负载均衡
  • 需要多个独立消费副本时,创建多个消费组(如 group-agroup-b

*FAQ

Q1: 同一 Stream 可以创建多个消费组吗? A: 可以。每个消费组独立维护 last-delivered-id 和 PEL,互不影响,适合多副本消费场景。

Q2: $0 有什么区别? A: $ 表示从 Stream 当前最后一条消息的下一个开始消费,只接收新消息;0 表示从第一条开始消费全部历史消息。

Q3: 创建组后可以修改起始 ID 吗? A: 不能直接修改。需要使用 XGROUP SETID 重置,但这会重置 PEL,需谨慎操作。