*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 功能,需用时间范围控制分页。