*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: 不会,聚合查询是只读的,不写入目标序列。