*Redis TS.CREATERULE 命令
TS.CREATERULE 创建源时间序列到目标时间序列的聚合规则(降采样规则),按指定时间窗口自动聚合数据。
*语法
TS.CREATERULE sourceKey destKey AGGREGATION aggregator bucketDuration [alignTimestamp]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| sourceKey | String | 是 | 源时间序列键名 |
| destKey | String | 是 | 目标时间序列键名(存储聚合结果) |
| AGGREGATION | Keyword | 是 | 聚合类型关键字 |
| aggregator | Enum | 是 | 聚合函数:avg、sum、min、max、range、count、first、last、std.p、std.s、var.p、var.s |
| bucketDuration | Integer | 是 | 聚合桶时长(毫秒) |
| alignTimestamp | Integer | 否 | 对齐时间戳,默认 0 |
*返回值
- OK:规则创建成功
- Error:键不存在、参数错误、目标键已存在等
*时间复杂度
O(1)
*
*示例
*创建 1 分钟平均值聚合
> TS.CREATE temperature:room1:1min
OK
> TS.CREATERULE temperature:room1 temperature:room1:1min AGGREGATION avg 60000
OK
*创建 5 分钟最大值聚合
> TS.CREATE temperature:room1:5min
OK
> TS.CREATERULE temperature:room1 temperature:room1:5min AGGREGATION max 300000
OK
*对齐到特定时间戳
> TS.CREATERULE temperature:room1 temperature:room1:hourly AGGREGATION avg 3600000 0
OK
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| TSDB: key does not exist | 源时间序列不存在 | 先创建源序列 |
| TSDB: the destination key already exists | 目标键已存在且不是空序列 | 使用新目标键名,或删除旧键 |
| TSDB: unsupported aggregation | 聚合类型不支持 | 检查 aggregator 拼写 |
*最佳实践
- 目标序列必须是空序列,创建时不要写入数据
- 聚合规则是实时的,新写入的数据会自动触发聚合
- 源序列的数据修改(如删除)不会影响已聚合的数据
- 多条规则可以指向同一个目标序列,实现多维度聚合
*FAQ
Q1: 聚合规则会处理历史数据吗? A: 不会,只对新写入的数据生效。历史数据需手动用 TS.RANGE + 聚合查询。
Q2: 可以删除聚合规则吗? A: 用 TS.DELETERULE 删除。
Q3: 聚合结果可以再次聚合吗? A: 可以,多层降采样是常见做法(如 1min → 5min → 1hour)。