*Redis TS.MRANGE 命令

TS.MRANGE 根据标签过滤器查询多个时间序列在指定时间范围内的数据点,支持聚合和分组。


*语法

TS.MRANGE 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.MRANGE 1625097600000 1625184000000 FILTER sensor=temp
1) 1) "temperature:room1"
   2) (empty array)
   3) 1) 1) (integer) 1625097600000
         2) "23.0"
      2) 1) (integer) 1625098200000
         2) "23.5"

*带聚合查询

> TS.MRANGE 1625097600000 1625184000000 AGGREGATION avg 300000 FILTER sensor=temp
1) 1) "temperature:room1"
   2) (empty array)
   3) 1) 1) (integer) 1625097600000
         2) "23.2"

*按标签分组

> TS.MRANGE 1625097600000 1625184000000 AGGREGATION avg 300000 GROUPBY room REDUCE avg FILTER sensor=temp
1) 1) "room=1"
   2) 1) 1) (integer) 1625097600000
         2) "23.2"

*常见错误

错误 原因 解决
ERR no such label 标签不存在 检查标签名是否正确
无结果 无匹配序列或时间范围无数据 检查 FILTER 条件和时间范围

*最佳实践

  • 大范围查询使用 AGGREGATION 降采样,减少返回数据量
  • 用 GROUPBY 实现多维度统计(如按房间求平均温度)
  • 用 COUNT 分页,避免单次返回过多数据
  • 生产环境注意查询范围,避免查询全量历史数据阻塞

*FAQ

Q1: TS.MRANGE 和 TS.MGET 的区别? A: TS.MRANGE 返回时间范围的数据点列表;TS.MGET 只返回最新数据点。

Q2: GROUPBY 可以按多个标签分组吗? A: 目前只能按单个标签分组。

Q3: 聚合查询会修改原始数据吗? A: 不会,聚合查询是只读的,不写入目标序列。