*Redis XREVRANGE 命令
返回 Stream 中指定 ID 范围内的消息,按 ID 从大到小排序。
*语法
XREVRANGE key end start [COUNT count]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | Stream 键名 |
| end | String | 是 | 结束 ID,+ 表示最大 ID |
| start | String | 是 | 起始 ID,- 表示最小 ID |
| COUNT | Integer | 否 | 最多返回数量 |
*返回值
| 条件 | 返回值 |
|---|---|
| 有消息 | 消息数组,格式同 XRANGE |
| 无消息 | 空数组 [] |
*时间复杂度
O(log(N)+M),N 为 Stream 消息数,M 为返回数量。
*示例
> XADD mystream * temp 20
"1717000000000-0"
> XADD mystream * temp 21
"1717000000001-0"
> XADD mystream * temp 22
"1717000000002-0"
# 读取最近 2 条
> XREVRANGE mystream + - COUNT 2
1) 1) "1717000000002-0"
2) 1) "temp"
2) "22"
2) 1) "1717000000001-0"
2) 1) "temp"
2) "21"
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 参数数量不足 | 检查 key、end、start 是否按顺序传入 |
| WRONGTYPE Operation against a key holding the wrong kind of value | 对非 Stream 类型执行 XREVRANGE | 使用 TYPE 命令确认 key 类型为 stream |
| ERR value is not an integer | COUNT 传入非整数 | 确保 COUNT 值为正整数 |
| 参数顺序错误导致返回空结果 | 先传 start 后传 end,与 XREVRANGE 的 end-start 顺序相反 | 确认参数顺序为 key end start [COUNT count] |
*最佳实践
最新消息查询:XREVRANGE 获取 Stream 中最近的消息,如读取最近的日志。
最新消息实时监控:配合 XREVRANGE + COUNT 1 实现获取最新消息,类似队列的尾部消费。
日志倒序查看:倒序查看 Stream 日志,先展示最新事件。
参数顺序检查:调用前确认参数顺序是 end 在前 start 在后,避免范围颠倒返回空结果。
*5. 结合 XRANGE 双向遍历:正向用 XRANGE,反向用 XREVRANGE,实现完整的双向分页浏览。
*FAQ
Q1: XREVRANGE 和 XRANGE 有什么区别? A: XREVRANGE 按 ID 从大到小返回;XRANGE 从小到大。XREVRANGE 的 start 和 end 参数顺序也相反(先传 end 再传 start)。
Q2: 为什么 XREVRANGE 参数顺序是 end start? A: 与 XREVRANGE 的含义一致——从大到小遍历,所以先指定大端(end)再指定小端(start)。
Q3: XREVRANGE 可以用于实时监控吗? A: 可以,但 XREAD 更适合实时阻塞等待。XREVRANGE 更适合历史倒序查询。
Q4: XREVRANGE 的 COUNT 是从尾部开始数吗? A: 是。XREVRANGE 从大到小遍历,COUNT 限制返回数量,即返回最新的 N 条。
Q5: XREVRANGE 可以配合阻塞命令使用吗? A: 不可以。XREVRANGE 是非阻塞命令,需要阻塞等待请使用 XREAD BLOCK。