首页 > 解决方案 > Redis XRANGE:ERR 指定为流命令参数的流 ID 无效

问题描述

我正在尝试使用XRANGE. Redis 文档指出,我需要在最后一个时间戳前加上前缀才能(独占。引用文档:

为了继续接下来的两个项目的迭代,我必须选择最后返回的 ID,即 1519073279157-0 并添加前缀 ( 。得到的排他范围间隔,即 (1519073279157-0 在这种情况下,现在可以用作下一个 XRANGE 调用的新开始参数:

但是,如果我这样做,我会得到一个错误,下面是两个命令,一个没有独占前缀,一个会产生错误:

redis:6379> XRANGE unittest 1612384862718-0 +
1) 1) "1612384862718-0"
   2) 1) "x"
      2) "42"
2) 1) "1612384862780-0"
   2) 1) "x"
      2) "43"
3) 1) "1612384862888-0"
   2) 1) "x"
      2) "44"
redis:6379> XRANGE unittest (1612384862718-0 +
(error) ERR Invalid stream ID specified as stream command argument

Redis 文档中的示例在我看来是一样的:

> XRANGE mystream (1519073279157-0 + COUNT 2
1) 1) 1519073280281-0
   2) 1) "foo"
      2) "value_3"
2) 1) 1519073281432-0
   2) 1) "foo"
      2) "value_4"

redis_version:6.0.6

标签: redis

解决方案


Redis 6.2 中已/将添加对独占/开放范围查询间隔的支持 - 请参阅https://github.com/redis/redis/pull/8072

对于以前的版本,推荐的方法是让客户端代码:

  1. 调用第一个 XRANGE/XREVRANGE 后,取最后一个 ID
  2. 解析时间戳和序列的最后一个 ID(均为 64 位整数)
  3. 如果执行 XRANGE,请尝试增加序列。对于 XREVRANGE 减少它。
  4. 如果序列上溢/下溢,对时间戳执行相同的算术运算并初始化序列(XREVRANGE 为 MAXINT,XREVRANGE 为 0)
  5. 处理“0-0”和“MAXINT-MAXJNT”情况
  6. 在下一次调用查询中使用新 ID 并重复

推荐阅读