XPENDING

语法
XPENDING key group [[IDLE min-idle-time] start end count [consumer]]
自版本起
5.0.0
时间复杂度
O(N),其中 N 是返回的元素数量,因此每次调用请求固定数量的条目是 O(1)。O(M),其中 M 是使用 IDLE 过滤器扫描的条目总数。当命令只返回摘要并且消费者列表很小时,它在 O(1) 时间内运行;否则,还需要 O(N) 时间来迭代每个消费者。
ACL 类别
@read, @stream, @slow,

通过消费者组从流中获取数据,而不确认这些数据,将导致创建待处理条目。这在 XREADGROUP 命令中得到了很好的解释,甚至在我们的 Redis 流介绍 中得到了更好的解释。 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,最后列出消费者组中的每个消费者,以及他们至少拥有的一个待处理消息和他们拥有的待处理消息数量。

XPENDING 的扩展形式

摘要提供了很好的概览,但有时我们对细节感兴趣。为了查看所有带有更多关联信息的待处理消息,我们需要也传递一个 ID 范围,这与我们使用 XRANGE 的方式类似,以及一个非可选的计数参数,以限制每次调用返回的消息数量

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

在扩展形式中,我们不再看到摘要信息,而是为待处理条目列表中的每条消息提供详细的信息。对于每条消息,将返回四个属性

  1. 消息的 ID。
  2. 获取消息并仍需确认的消费者的名称。我们将其称为消息的当前所有者
  3. 上次将此消息传递给该消费者以来的毫秒数。
  4. 此消息传递的次数。

传递计数器,即数组中的第四个元素,当某些其他消费者使用 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 命令允许遍历待处理条目,就像 XRANGEXREVRANGE 允许遍历流的条目一样。您可以通过在最后一个读取的待处理条目的 ID 前缀加上 ( 字符(表示开放(独占)范围)并将其提供给对该命令的后续调用来实现。

RESP2/RESP3 回复

  • 数组回复:取决于调用 XPENDING 的方式,数据将有所不同,如本页所述。

历史记录

  • 从 Redis 6.2.0 版开始:添加了 IDLE 选项和独占范围间隔。
RATE THIS PAGE
Back to top ↑