XPENDING
XPENDING key group [[IDLE min-idle-time] start end count [consumer]]
- 可用版本
- Redis 开源版 5.0.0
- 时间复杂度
- O(N),其中 N 是返回的元素数量,因此每次调用请求固定数量的条目是 O(1)。使用 IDLE 过滤器时,时间复杂度为 O(M),其中 M 是扫描的条目总数。当命令只返回摘要且消费者列表很小时,运行时长为 O(1);否则,迭代每个消费者需要额外的 O(N) 时间。
- ACL 类别
-
@read
,@stream
,@slow
,
通过消费者组从流中获取数据但不确认数据,会导致创建*待处理条目*。这在 XREADGROUP
命令中有详细解释,在我们的 Redis Streams 简介中解释得更详细。`XACK` 命令会立即从待处理条目列表 (PEL) 中移除待处理条目,因为一旦消息成功处理,消费者组就不再需要跟踪它并记住消息的当前所有者了。
XPENDING
命令是用于检查待处理消息列表的接口,因此是观察和理解流消费者组状态的一个非常重要的命令:哪些客户端处于活动状态,哪些消息等待被消费,或者是否存在空闲消息。此外,该命令与 XCLAIM
命令一起用于实现长时间失败的消费者恢复,从而确保某些消息不会被遗漏:不同的消费者可以认领该消息并继续处理。这在流简介和 XCLAIM
命令页面中有更详细的解释,此处不再赘述。
XPENDING 的摘要形式
当 XPENDING
仅带有一个键名和一个消费者组名调用时,它只输出给定消费者组中待处理消息的摘要。在以下示例中,我们创建一个消费者组,并立即通过使用 XREADGROUP
从该组中读取消息来创建待处理消息。
> 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"
我们预期消费者组 group55
的待处理条目列表现在会有一个消息:名为 consumer-123
的消费者获取了该消息但没有确认处理。简单的 XPENDING
形式将提供我们这些信息
> XPENDING mystream group55
1) (integer) 1
2) 1526984818136-0
3) 1526984818136-0
4) 1) 1) "consumer-123"
2) "1"
在这种形式下,命令输出此消费者组中待处理消息的总数(本例中为一),接着是待处理消息中的最小 ID 和最大 ID,然后列出消费者组中每个至少有一个待处理消息的消费者及其待处理消息的数量。
XPENDING 的扩展形式
摘要提供了很好的概览,但有时我们对细节更感兴趣。为了查看所有待处理消息及其更多关联信息,我们还需要传递一个 ID 范围,方式与 XRANGE
类似,以及一个非可选的 *count* 参数,用于限制每次调用返回的消息数量
> XPENDING mystream group55 - + 10
1) 1) 1526984818136-0
2) "consumer-123"
3) (integer) 196415
4) (integer) 1
在扩展形式中,我们不再看到摘要信息,而是待处理条目列表中每条消息的详细信息。对于每条消息,会返回四个属性
- 消息的 ID。
- 获取了消息但尚未确认的消费者的名称。我们称其为消息的当前*所有者*。
- 自上次将此消息传递给此消费者以来经过的毫秒数。
- 此消息被传递的次数。
传递计数器(数组中的第四个元素)会在其他消费者使用 XCLAIM
认领消息时增加,或者当通过 XREADGROUP
再次传递消息时(访问消费者组中消费者的历史记录时)增加(更多信息请参见 XREADGROUP
页面)。
可以向命令传递一个附加参数,以查看具有特定所有者的消息
> XPENDING mystream group55 - + 10 consumer-123
但在上述情况中输出将是相同的,因为我们只有一个消费者的待处理消息。然而,需要记住的重要一点是,即使有许多消费者产生的许多待处理消息,按特定消费者过滤此操作也不会低效:我们既有全局的待处理条目列表数据结构,也有每个消费者的列表,因此我们可以非常高效地仅显示单个消费者的待处理消息。
空闲时间过滤器
也可以按待处理流条目的空闲时间(以毫秒为单位)进行过滤(对于通过 XCLAIM
认领一段时间未处理的条目非常有用)
> XPENDING mystream group55 IDLE 9000 - + 10
> XPENDING mystream group55 IDLE 9000 - + 10 consumer-123
第一种情况将返回整个组中空闲超过 9 秒的前 10 个(或更少)PEL 条目,而第二种情况仅返回 consumer-123
的条目。
独占范围和迭代 PEL
XPENDING
命令允许像 XRANGE
和 XREVRANGE
迭代流条目一样迭代待处理条目。您可以通过在上次读取的待处理条目 ID 前面加上字符 (
来实现,该字符表示开放(独占)范围,并将其提供给后续对命令的调用。
RESP2/RESP3 回复
- 数组回复:根据调用 XPENDING 的方式不同,返回的数据也不同,如本页所述。
历史版本
- 自 Redis 6.2.0 版本开始:添加了
IDLE
选项和独占范围间隔。