XRANGE

用法
XRANGE key start end [ COUNT count ]
复杂度
O(N),其中 N 是返回的元素数量。如果 N 是常量(例如,总是使用 COUNT 请求前 10 个元素),则可以认为是 O(1)。
起始版本
5.0.0
ACL 类别
@stream, @read, @slow

该命令返回与给定 ID 范围匹配的流条目。范围由最小和最大 ID 指定。所有 ID 介于两个指定 ID 之间或正好是其中一个指定 ID(闭区间)的条目都将被返回。

XRANGE 命令有多种应用场景

  • 在特定时间范围内返回项目。这之所以可能,是因为流 ID 与时间相关
  • 增量迭代流,每次迭代只返回少量项目。然而,它在语义上比 SCAN 系列函数更健壮。
  • 从流中获取单个条目,通过将要获取的条目 ID 指定两次:作为查询区间的开始和结束。

该命令还有一个以反向顺序返回项目的对应命令,名为 XREVRANGE,该命令在其他方面与此命令相同。

-+ 特殊 ID

-+ 特殊 ID 分别表示流中可能的最小 ID 和最大 ID,因此以下命令将返回流中的所有条目

> XRANGE somestream - +
1) 1) 1526985054069-0
   2) 1) "duration"
      2) "72"
      3) "event-id"
      4) "9"
      5) "user-id"
      6) "839248"
2) 1) 1526985069902-0
   2) 1) "duration"
      2) "415"
      3) "event-id"
      4) "2"
      5) "user-id"
      6) "772213"
... other entries here ...

-+ 特殊 ID 分别表示最小和最大范围 ID,但它们更易于输入。

不完整的 ID

流 ID 由两部分组成:Unix 毫秒时间戳和在同一毫秒内插入的条目的序列号。可以使用 XRANGE 仅指定 ID 的第一部分,即毫秒时间,示例如下

> XRANGE somestream 1526985054069 1526985055069

在这种情况下,XRANGE 会自动将起始区间补齐为 -0,将结束区间补齐为 -18446744073709551615,以便返回在给定毫秒到另一个指定毫秒结束之间生成的所有条目。这也意味着重复两次相同的毫秒,我们将获得在该毫秒内的所有条目,因为序列号范围将从零到最大值。

以这种方式使用时,XRANGE 作为一个范围查询命令,用于在指定时间内获取条目。这对于访问流中过去事件的历史记录非常方便。

独占范围

默认情况下,范围是闭合的(包含),这意味着返回的结果可以包含 ID 与查询的开始和结束区间匹配的条目。可以通过在 ID 前面加上字符 ( 来指定一个开放区间(独占)。这对于迭代流很有用,如下所述。

返回最大条目数

使用 COUNT 选项可以减少报告的条目数量。这是一个非常重要的功能,即使它看起来微不足道,因为它允许,例如,模拟诸如给我大于或等于以下内容的条目等操作

> XRANGE somestream 1526985054069-0 + COUNT 1
1) 1) 1526985054069-0
   2) 1) "duration"
      2) "72"
      3) "event-id"
      4) "9"
      5) "user-id"
      6) "839248"

在上述情况下,条目 1526985054069-0 存在,否则服务器会发送下一个条目给我们。使用 COUNT 也是将 XRANGE 作为迭代器使用的基础。

迭代流

为了迭代流,我们可以按以下步骤进行。假设我们每次迭代需要两个元素。我们从获取前两个元素开始,这很简单

> XRANGE writers - + COUNT 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"

然后,我们不从 - 重新开始迭代,而是将上一个 XRANGE 调用返回的*最后一个*条目的 ID 作为独占区间,作为范围的起始。

最后一个条目的 ID 是 1526985685298-0,所以我们只需在其前加上一个 '(', 然后继续迭代

> XRANGE writers (1526985685298-0 + COUNT 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"

依此类推。最终这将允许访问流中的所有条目。显然,我们可以从任何 ID 开始迭代,甚至从特定时间开始,通过提供一个不完整的起始 ID。此外,我们可以通过提供一个结束 ID 或不完整的 ID 来代替 +,从而将迭代限制在给定的 ID 或时间。

命令 XREAD 也能够迭代流。命令 XREVRANGE 可以反向迭代流,从较高的 ID(或时间)到较低的 ID(或时间)。

获取单个项目

如果您正在寻找 XGET 命令,您会失望的,因为 XRANGE 实际上是从流中获取单个条目的方式。您所要做的就是在 XRANGE 的参数中两次指定该 ID

> XRANGE mystream 1526984818136-0 1526984818136-0
1) 1) 1526984818136-0
   2) 1) "duration"
      2) "1532"
      3) "event-id"
      4) "5"
      5) "user-id"
      6) "7782813"

关于流的更多信息

有关流的更多信息,请查阅我们的流简介文档

示例

127.0.0.1:6379> XADD writers * name Virginia surname Woolf
"1714701492065-0"
127.0.0.1:6379> XADD writers * name Jane surname Austen
"1714701492075-0"
127.0.0.1:6379> XADD writers * name Toni surname Morrison
"1714701492084-0"
127.0.0.1:6379> XADD writers * name Agatha surname Christie
"1714701492094-0"
127.0.0.1:6379> XADD writers * name Ngozi surname Adichie
"1714701492104-0"
127.0.0.1:6379> XLEN writers
(integer) 5
127.0.0.1:6379> XRANGE writers - + COUNT 2
1) 1) "1714701492065-0"
   2) 1) "name"
      2) "Virginia"
      3) "surname"
      4) "Woolf"
2) 1) "1714701492075-0"
   2) 1) "name"
      2) "Jane"
      3) "surname"
      4) "Austen"

RESP2/RESP3 回复

数组回复:一个流条目列表,其 ID 与指定的范围匹配。

历史

版本 变更
6.2.0

添加了独占范围。