XRANGE 系列
XRANGE key start end [COUNT count]
- 从以下位置开始可用:
- 5.0.0
- 时间复杂度:
- O(N),其中 N 是返回的元素数。如果 N 是常数(例如,总是用 COUNT 请求前 10 个元素),你可以认为它是 O(1)。
- ACL 类别:
-
@read
,@stream
,@slow
,
该命令返回与给定 ID 范围匹配的流条目。 该范围由最小和最大 ID 指定。所有具有 两个指定 ID 之间的 ID 或指定的两个 ID 中的一个 ID (closed interval) 返回。
这XRANGE
命令有许多应用程序:
- 返回特定时间范围内的项目。这是可能的,因为 流 ID 与时间相关。
- 以增量方式迭代流,仅返回
每次迭代都有几个项目。然而,它在语义上要多得多
比
SCAN
函数系列。 - 从流中获取单个条目,并提供该条目的 ID 要提取两次:作为查询间隔的开始和结束。
该命令还有一个互惠命令,返回
反向顺序,称为XREVRANGE
,否则完全相同。
-
和特殊 ID+
和 special ID 分别表示可能的最小 ID
以及流中可能的最大 ID,因此以下命令
将只返回 Stream 中的每个条目:-
+
> 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 ...
和 special ID 分别表示最小和最大范围 ID,
但是,它们更易于键入。-
+
不完整的 ID
流 ID 由两部分组成:Unix 毫秒时间戳和
在同一毫秒中插入的条目的序列号。这是可能的
使用XRANGE
仅指定 ID 的第一部分,即毫秒时间,
如以下示例所示:
> XRANGE somestream 1526985054069 1526985055069
在这种情况下,XRANGE
将自动完成 Start interval-0
和 end interval 为-18446744073709551615
,为了返回所有
在给定毫秒到
另一个指定的毫秒。这也意味着重复相同的
millisecond 两次,我们得到该毫秒内的所有条目,
因为序列号范围将从零到最大值。
以这种方式使用XRANGE
用作 Range 查询命令以获取条目
在指定时间内。这对于访问历史记录非常方便
流中过去的事件。
独家系列
默认情况下,范围是 close (包括) ,这意味着回复可以包括
ID 与查询的开始和结束间隔匹配的条目。这是可能的
指定打开间隔(不包括),方法是在 ID 前面加上
字符。这对于迭代流非常有用,如下所述。(
返回最大条目数
使用 COUNT 选项可以减少条目数 报道。这是一个非常重要的特征,即使它可能看起来微不足道, 因为它允许对 Give Me 等作进行建模 条目大于或等于以下内容:
> 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
也是 base 为了
用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"
然后,而不是从 中再次开始迭代,作为 start
的 ID 中,我们使用
以前-
XRANGE
call 作为独占间隔。
最后一个条目的 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。此外,我们
可以通过提供 end 将迭代限制为给定的 ID 或时间
ID 或不完整的 ID 而不是 .+
命令XREAD
也能够迭代流。
命令XREVRANGE
可以从更高的 ID 迭代流反向
(或时间)来降低 ID(或时间)。
使用早期版本的 Redis 进行迭代
虽然独占范围间隔仅在 Redis 6.2 中可用,但它仍然可用 可以将类似的 Stream Iteration 模式与早期版本一起使用。你 按照上述相同的方式开始从 Stream 中获取 第一个条目。
对于后续调用,您需要以编程方式将最后一个
返回 entry 的 ID。大多数 Redis 客户端应该抽象出这个细节,但是
如果需要,也可以在应用程序中实现。在上面的示例中,
这意味着递增1526985685298-0
乘以 1,从 0 到 1。
因此,第二个调用将是:
> XRANGE writers 1526985685298-1 + COUNT 2
1) 1) 1526985691746-0
2) 1) "name"
2) "Toni"
...
另请注意,一旦最后一个 ID 的序列部分等于
18446744073709551615,您需要增加时间戳并重置
sequence part 设置为 0。例如,递增 ID1526985685298-18446744073709551615
应导致1526985685299-0
.
对称模式适用于迭代流XREVRANGE
.这
唯一的区别是客户端需要为后续的
调用。当递减序列部分为 0 的 ID 时,时间戳需要
以递减 1 并将序列设置为 18446744073709551615。
获取单个项目
如果您寻找XGET
命令你会失望的,因为XRANGE
实际上是从
流。您所要做的就是在参数中指定 ID 两次
XRANGE 的:
> 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"
有关流的其他信息
有关 Redis 流的更多信息,请查看我们的 Redis 流简介文档。
例子
RESP2/RESP3 回复
Array reply:ID 匹配指定范围的 stream 条目列表。历史
- 从 Redis 版本 6.2.0 开始:添加了独占范围。