*Redis TS.MREVRANGE 命令
TS.MREVRANGE 是 TS.MRANGE 的倒序版本,返回时间范围内的数据点按时间戳从大到小排序。
*语法
TS.MREVRANGE fromTimestamp toTimestamp [LATEST] [FILTER_BY_TS ts...] [FILTER_BY_VALUE min max] [COUNT count] [ALIGN align] [AGGREGATION aggregator bucketDuration] [GROUPBY label REDUCE reducer] [FILTER filter...] [WITHLABELS] [SELECTED_LABELS label...] [EMPTY]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| fromTimestamp | Integer | 是 | 起始时间戳(毫秒),- 表示最小时间 |
| toTimestamp | Integer | 是 | 结束时间戳(毫秒),+ 表示最大时间 |
| LATEST | Flag | 否 | 返回最新数据点(考虑聚合规则) |
| FILTERBYTS | List | 否 | 只返回指定时间戳的数据 |
| FILTERBYVALUE | Range | 否 | 只返回指定值范围的数据 |
| COUNT | Integer | 否 | 限制返回的数据点数量 |
| ALIGN | Integer | 否 | 聚合对齐时间戳 |
| AGGREGATION | Keyword | 否 | 聚合类型和桶时长 |
| GROUPBY | Keyword | 否 | 按标签分组并聚合 |
| FILTER | List | 是 | 标签过滤条件 |
| WITHLABELS | Flag | 否 | 返回包含标签信息 |
| SELECTED_LABELS | List | 否 | 只返回指定标签 |
| EMPTY | Flag | 否 | 返回空桶 |
*返回值
- Array:每个匹配序列的返回数组,数据点按时间戳降序排列
- 结构:
[[key, labels, [[timestamp, value], ...]], ...]
- 结构:
*时间复杂度
O(N + M),N 为匹配的序列数量,M 为返回的数据点总数。
*示例
*基本倒序查询
> TS.MREVRANGE 1625097600000 1625184000000 FILTER sensor=temp
1) 1) "temperature:room1"
2) (empty array)
3) 1) 1) (integer) 1625184000000
2) "24.0"
2) 1) (integer) 1625183400000
2) "23.8"
*倒序带聚合
> TS.MREVRANGE 1625097600000 1625184000000 AGGREGATION avg 300000 FILTER sensor=temp
1) 1) "temperature:room1"
2) (empty array)
3) 1) 1) (integer) 1625184000000
2) "23.9"
*倒序限制数量
> TS.MREVRANGE 1625097600000 1625184000000 COUNT 10 FILTER sensor=temp
...(返回最近 10 条数据)
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR no such label | 标签不存在 | 检查标签名 |
| 无结果 | 无匹配序列或时间范围无数据 | 检查条件和时间范围 |
*最佳实践
- 查看最新数据时优先使用 TS.MREVRANGE,无需遍历全量数据
- 配合 COUNT 限制返回数量,实现"最近 N 条"查询
- 与 TS.MRANGE 相同,支持聚合和分组功能
- 倒序查询内存占用和性能与正序基本相同
*FAQ
Q1: TS.MREVRANGE 和 TS.MRANGE 的区别? A: 仅排序方向不同,TS.MREVRANGE 按时间戳降序,TS.MRANGE 按时间戳升序。
Q2: 倒序查询会影响性能吗? A: 不会,RedisTimeSeries 内部支持双向遍历,性能基本一致。
Q3: 可以用 COUNT 实现分页吗? A: 可以,用 COUNT 限制返回数量,但无 offset 功能,需用时间范围控制分页。