*Redis XRANGE 命令

返回 Stream 中指定 ID 范围内的消息,按 ID 从小到大排序。


*语法

XRANGE key start end [COUNT count]

*参数说明

参数 类型 必填 说明
key String Stream 键名
start String 起始 ID,- 表示最小 ID
end String 结束 ID,+ 表示最大 ID
COUNT Integer 最多返回数量

*返回值

条件 返回值
有消息 消息数组 [[id, [field, value, ...]], ...]
无消息 空数组 []

*时间复杂度

O(log(N)+M),N 为 Stream 消息数,M 为返回数量。


*示例

# 读取全部
> XRANGE mystream - +
1) 1) "1717000000000-0"
   2) 1) "temperature"
      2) "19.8"
2) 1) "1717000000001-0"
   2) 1) "event"
      2) "click"

# 指定范围
> XRANGE mystream 1717000000000-0 1717000000000-999

# 分页
> XRANGE mystream - + COUNT 10

*常见错误

错误 原因 解决
ERR wrong number of arguments 参数数量不足 检查 key、start、end 是否都传入
ERR Invalid stream ID start/end 不是有效的 Stream ID 格式 使用 -/+ 或合法时间戳-序列号格式
WRONGTYPE Operation against a key holding the wrong kind of value 对非 Stream 类型执行 XRANGE 使用 TYPE 命令确认 key 类型为 stream
ERR value is not an integer COUNT 传入非整数 确保 COUNT 值为正整数

*最佳实践

  1. 历史查询:按时间范围查询 Stream 历史消息。
  2. 分页遍历:COUNT 分页读取,ID 范围精确定位。

  3. ID 生成策略:使用 * 让 Redis 自动生成时间戳-序列号 ID,避免手动构造 ID 冲突。

  4. 分页游标:结合 COUNT 和具体 ID 范围实现分页,不要用固定偏移量翻页。

*5. 时间戳查询:利用 ID 前缀匹配查询某段时间范围的数据,如 XRANGE mystream 1717000000000-0 1717999999999-999

*FAQ

Q1: XRANGE 和 XREVRANGE 有什么区别? A: XRANGE 从小到大;XREVRANGE 从大到小。

Q2: -+ 是什么意思? A: - 表示 Stream 最小 ID;+ 表示最大 ID。

Q3: XRANGE 返回的消息包含 ID 吗? A: 包含。返回格式为 [[id, [field, value, ...]], ...],第一个元素就是消息 ID。

Q4: Stream 为空时 XRANGE 返回什么? A: 返回空数组 []

Q5: 可以用 XRANGE 实现时间序列查询吗? A: 可以。Redis Stream ID 默认包含毫秒时间戳,XRANGE 天然支持按时间范围查询。