*Redis TS.RANGE 命令
TS.RANGE 返回单个时间序列在指定时间范围内的数据点,支持聚合、过滤和分组。
*语法
TS.RANGE key fromTimestamp toTimestamp [LATEST] [FILTER_BY_TS ts...] [FILTER_BY_VALUE min max] [COUNT count] [ALIGN align] [AGGREGATION aggregator bucketDuration]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | 时间序列键名 |
| fromTimestamp | Integer | 是 | 起始时间戳(毫秒),- 表示最小时间 |
| toTimestamp | Integer | 是 | 结束时间戳(毫秒),+ 表示最大时间 |
| LATEST | Flag | 否 | 返回最新数据点(考虑聚合规则) |
| FILTERBYTS | List | 否 | 只返回指定时间戳的数据 |
| FILTERBYVALUE | Range | 否 | 只返回指定值范围的数据 |
| COUNT | Integer | 否 | 限制返回的数据点数量 |
| ALIGN | Integer | 否 | 聚合对齐时间戳 |
| AGGREGATION | Keyword | 否 | 聚合类型和桶时长 |
*返回值
- Array:数据点数组
[[timestamp, value], ...],按时间戳升序排列
*时间复杂度
O(M),M 为返回的数据点数量。带聚合时为 O(N),N 为查询范围内的原始点数。
*示例
*基本范围查询
> TS.RANGE temperature:room1 1625097600000 1625184000000
1) 1) (integer) 1625097600000
2) "23.0"
2) 1) (integer) 1625098200000
2) "23.5"
*使用通配符
> TS.RANGE temperature:room1 - +
...(返回全部数据)
*带聚合查询
> TS.RANGE temperature:room1 1625097600000 1625184000000 AGGREGATION avg 300000
1) 1) (integer) 1625097600000
2) "23.2"
*限制返回数量
> TS.RANGE temperature:room1 1625097600000 1625184000000 COUNT 100
...(最多返回 100 条)
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| TSDB: key does not exist | 时间序列不存在 | 检查 key 名或创建序列 |
| WRONGTYPE | key 不是时间序列 | 确认 key 类型 |
*最佳实践
- 大范围查询务必使用 AGGREGATION 降采样,避免返回海量数据
- 用 COUNT 分页,配合时间范围滑动窗口实现分页加载
- 用
-和+查询全量数据时谨慎,可能阻塞 Redis - 聚合查询是只读的,不修改原始数据
*FAQ
Q1: TS.RANGE 和 TS.MRANGE 的区别? A: TS.RANGE 查询单个序列;TS.MRANGE 根据标签过滤查询多个序列。
Q2: 聚合查询的结果会保存吗? A: 不会,TS.RANGE 的聚合是查询时计算的,不保存。要保存用 TS.CREATERULE 创建聚合规则。
Q3: 可以返回数据点数量吗? A: 没有直接返回数量的命令,可以 COUNT 1 获取第一条,或用 TS.INFO 查看 totalSamples。