*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。