Redis 命令及数据类型 -- TimeSeries

摘要

TimeSeries 简介

一个 Redis 时间序列(Time Series) 是有序的一系列采样数据点:

组成部分 说明
时间戳(timestamp) 毫秒级时间标签,可客户端指定或由服务器填充
值(value) 64 位浮点数
元数据(labels) 一组键值对,可用于过滤与聚合查询
保留策略(retention) 数据生命周期控制,过期自动丢弃
  • 主要功能与特性

特性 说明
高吞吐写入 支持每秒接收大量数据点,延迟极低
区间查询 可按时间范围检索数据,如 TS.RANGE / TS.MRANGE
聚合查询 内建 min、max、avg、sum、count、first、last 等聚合功能
自动下采样 & 累积规则 通过 aggregation rules 自动生成更粗粒度指标
保留策略(Retention) 设置最大保存时间或样本数量
标签索引(Labels) 支持基于标签的跨序列查询
高效存储 使用压缩与内存结构优化空间成本
工具整合 支持 Grafana、Prometheus、Telegraf 等生态集成
  • 应用场景

场景 描述
物联网(IoT)监控 温度、湿度、设备状态等
系统监控与指标收集 CPU、内存、网络指标的实时存储与分析
业务指标分析 每日/每小时活跃用户数量、请求延迟等
金融时间序列 股票价格、交易量的快速写入和分析
实时告警 数据越界时触发告警逻辑

TimeSeries 命令说明

  • 按“生命周期”视角的快速索引

阶段 对应命令
创建 TS.CREATE
修改结构 TS.ALTER
建立聚合 TS.CREATERULE / TS.DELETERULE
写入 TS.ADD / TS.MADD / TS.INCRBY / TS.DECRBY
查询单序列 TS.GET / TS.RANGE / TS.REVRANGE
查询多序列 TS.MGET / TS.MRANGE / TS.MREVRANGE / TS.QUERYINDEX
清理数据 TS.DEL
查看状态 TS.INFO

一、时间序列创建与结构管理类

命令 功能说明 典型使用场景
TS.CREATE 创建一个新的时间序列(可指定保留策略、标签、chunk 大小等) 初始化指标,如创建 CPU、QPS、延迟等指标序列
TS.ALTER 修改已有时间序列的配置(retention、chunk size、duplicate policy、labels) 动态调整数据保留周期、标签信息
TS.CREATERULE 创建压缩 / 聚合规则(从 source series 自动聚合到 dest series) 原始数据 → 按分钟 / 小时聚合
TS.DELETERULE 删除已有的压缩 / 聚合规则 停止某条自动聚合规则

1️⃣ TS.CREATE : 创建时间序列

  • 语法:

1
2
3
4
5
6
7
TS.CREATE key
[RETENTION retentionPeriod]
[ENCODING <COMPRESSED|UNCOMPRESSED>]
[CHUNK_SIZE size]
[DUPLICATE_POLICY policy]
[IGNORE ignoreMaxTimediff ignoreMaxValDiff]
[LABELS [label value ...]]
  • 参数说明:

参数 作用 可选值 / 约束 默认值 典型使用建议
key 时间序列的 Redis Key 任意合法 Redis key 建议包含业务语义,如 ts:cpu:node1
RETENTION 数据保留时长(毫秒),超过自动删除 ≥ 0,0 表示永久保留 0 高频指标必须设置,避免内存无限增长
ENCODING 数据存储编码方式 COMPRESSED: 内存占用低,CPU 有轻微开销
UNCOMPRESSED:查询快,占用内存高
COMPRESSED 绝大多数场景保持默认
CHUNK_SIZE 每个数据块的大小(字节),影响内存碎片与压缩效率 ≥ 128 bytes(通常 1KB–64KB) 4096 写入频繁时适当调大
DUPLICATE_POLICY 同一 timestamp 重复写入时的处理策略 见下表 全局配置 明确指定,避免默认行为变化
IGNORE 忽略与上一点差异过小的数据 ignoreMaxTimediff: 最大允许时间差(毫秒)
ignoreMaxValDiff: 最大允许的数值差
关闭 用于降噪和降采样
示例:IGNORE 1000 0.01: 1 秒内,变化小于 0.01 的数据将被忽略
LABELS 标签键值对,用于索引和过滤 任意字符串对
LABELS key1 value1 key2 value2 ...
强烈建议用于查询
  • DUPLICATE_POLICY(重复时间戳策略)

当同一个 timestamp 被多次写入时生效

策略 处理逻辑
BLOCK 默认,重复时间戳直接失败
FIRST 保留已有值,忽略新值
LAST 覆盖已有值,用新值替代
MIN 仅当新值更小才覆盖
MAX 仅当新值更大才覆盖
SUM 累加值(已有值 + 新值)
  • 示例: 创建一个 CPU 指标时间序列,自动过期 1 小时之前的数据

1
2
3
4
5
6
7
8
9
10
11
TS.CREATE ts:cpu:server1
RETENTION 3600000
ENCODING COMPRESSED
CHUNK_SIZE 8192
DUPLICATE_POLICY LAST
IGNORE 1000 0.1
LABELS host server1 metric cpu

# 查看数据类型
127.0.0.1:6379> type ts:cpu:server1
TSDB-TYPE

2️⃣ TS.ALTER : 修改时间序列配置

  • 语法:

1
2
3
4
5
TS.ALTER key
[RETENTION retentionPeriod]
[CHUNK_SIZE size]
[DUPLICATE_POLICY policy]
[LABELS [label value ...]]
  • 示例:修改保留周期和标签

1
2
3
TS.ALTER ts:cpu:server1
RETENTION 7200000
LABELS host server1 metric cpu env prod

3️⃣ TS.CREATERULE : 创建自动聚合规则

  • 场景说明

    • 原始序列:ts:cpu:server1(秒级数据)
    • 聚合目标:ts:cpu:server1:avg1m(按 1 分钟平均值聚合)
  • 语法:

1
2
3
TS.CREATERULE sourceKey destKey
AGGREGATION aggregator bucketDuration
[alignTimestamp]
  • 参数说明

参数 作用 可选值 / 约束 是否必填 行为说明 使用注意事项
sourceKey 源时间序列 Key 必须是已存在的 TS key 新写入数据从该序列触发聚合 必须先创建
destKey 目标聚合时间序列 Key 必须是已存在的 TS key 聚合结果写入该序列 通常 retention 更长
aggregator 聚合函数 见下表 定义每个 bucket 内如何计算 不同函数计算成本不同
bucketDuration 聚合时间桶宽度(毫秒) > 0 控制聚合粒度 决定数据降采样程度
alignTimestamp 对齐时间戳基准 毫秒时间戳 控制 bucket 起始对齐方式 跨系统对齐时非常重要
  • aggregator(聚合函数)

聚合器 说明
AVG 平均值
SUM 求和
MIN 最小值
MAX 最大值
COUNT 样本数量
FIRST 第一个样本
LAST 最后一个样本
RANGE MAX - MIN
STD.P 总体标准差
STD.S 样本标准差
VAR.P 总体方差
VAR.S 样本方差
  • alignTimestamp(对齐时间戳基准)

类型 示例值 含义
0(Unix Epoch)(推荐做法) 0 从 1970-01-01 00:00:00 UTC 对齐
任意固定时间戳 1700000000000 从指定时间点对齐
当前时间戳 $(date +%s%3N) 从创建规则时刻对齐
业务时间边界 某天 00:00 的毫秒值 对齐到业务周期
不指定 (参数省略) 自动使用首条写入时间
  • 示例: 每 60,000ms(1分钟)做一次平均聚合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 1.创建目标聚合序列
TS.CREATE ts:cpu:server1:avg1m
RETENTION 86400000
LABELS host server1 metric cpu_1m

# 2.创建自动聚合规则
TS.CREATERULE ts:cpu:server1 ts:cpu:server1:avg1m
AGGREGATION AVG 60000
## 如果未设置 alignTimestamp,则以创建的第一条记录的时间为基准
## 比如第一条记录的时间为:12:00:23
## bucket 会对齐到:
# 12:00:23 ~ 12:01:23
# 12:01:23 ~ 12:02:23

# 指定 alignTimestamp 对齐到整分钟
TS.CREATERULE ts:cpu:server1 ts:cpu:server1:avg1m
AGGREGATION AVG 60000 0
## bucket 会严格对齐:
# 12:00:00 ~ 12:01:00
# 12:01:00 ~ 12:02:00

4️⃣ TS.DELETERULE : 删除自动聚合规则

  • 语法:

1
TS.DELETERULE sourceKey destKey
  • 示例:删除自动聚合规则

1
TS.DELETERULE ts:cpu:server1 ts:cpu:server1:avg1m

二、数据写入与更新类

命令 功能说明 典型使用场景
TS.ADD 向时间序列追加一个样本点(timestamp, value) 实时写入监控数据
TS.MADD 批量向多个时间序列追加样本 高吞吐场景,减少网络 RTT
TS.INCRBY 对最新时间戳的值做自增(不存在则创建新样本) 计数器、累计指标
TS.DECRBY 对最新时间戳的值做自减(不存在则创建新样本) 库存、余额类递减指标

1️⃣ TS.ADD : 向时间序列追加一个样本点

  • 语法:

1
2
3
4
5
6
7
8
TS.ADD key timestamp value
[RETENTION retentionPeriod]
[ENCODING <COMPRESSED|UNCOMPRESSED>]
[CHUNK_SIZE size]
[DUPLICATE_POLICY policy]
[ON_DUPLICATE policy_ovr]
[IGNORE ignoreMaxTimediff ignoreMaxValDiff]
[LABELS [label value ...]]
  • 如果 key 不存在,TS.ADD 会 隐式创建时间序列(类似 TS.CREATE)。

  • 参数说明

参数 作用 可选值 / 约束 是否覆盖已有配置 生效范围 使用注意事项
key 时间序列 Key 合法 Redis key 不存在时自动创建
timestamp 样本时间戳 毫秒整数 / * 当前写入 * 表示服务器当前时间
value 样本值 浮点数 当前写入 NaN / Inf 不允许
RETENTION 设置保留周期 ≥ 0(毫秒) 仅首次创建生效 序列级 已存在 key 不会被修改
ENCODING 存储编码 COMPRESSED / UNCOMPRESSED 仅首次创建生效 序列级 生产推荐 COMPRESSED
CHUNK_SIZE 数据块大小 ≥ 128 bytes 仅首次创建生效 序列级 不影响已有 chunk
DUPLICATE_POLICY 设置默认重复策略 BLOCK / FIRST / LAST / MIN / MAX / SUM 仅首次创建生效 序列级 与 ON_DUPLICATE 有优先级关系
ON_DUPLICATE 本次写入的重复策略 同上 覆盖序列级策略 当前写入 推荐用于临时覆盖
IGNORE 忽略微小变化写入 两个阈值 仅首次创建生效 序列级 用于降噪
LABELS 设置标签 键值对 仅首次创建生效 序列级 已存在 key 不会修改
  • 示例:写入一个时间序列

1
2
3
TS.ADD ts:cpu:server1 * 80.5
## 输出
(integer) 1767777655255 # 当前时间戳

2️⃣ TS.MADD : 批量向多个时间序列追加样本

  • 语法

1
TS.MADD key timestamp value [key timestamp value ...]
  • 示例:批量写入多个时间序列

1
2
3
4
5
6
# 批量写入三个时间序列,时间序列必须存在
TS.MADD ts:cpu:server1 * 80.5 ts:cpu:server2 * 90.5 ts:cpu:server3 * 70.5
## 输出
1) (integer) 1767777807933
2) (integer) 1767777807933
3) (integer) 1767777807933

3️⃣ TS.INCRBY : 对最新时间戳的值做自增(不存在则创建新样本)

  • 语法:

1
2
3
4
5
6
7
8
TS.INCRBY key addend
[TIMESTAMP timestamp]
[RETENTION retentionPeriod]
[ENCODING <COMPRESSED|UNCOMPRESSED>]
[CHUNK_SIZE size]
[DUPLICATE_POLICY policy]
[IGNORE ignoreMaxTimediff ignoreMaxValDiff]
[LABELS [label value ...]]
  • 参数说明

参数 作用 可选值 / 约束 是否覆盖已有配置 生效范围 使用注意事项
key 时间序列 Key 合法 Redis key 不存在会自动创建
addend 增量值 浮点数 当前写入 支持负数(等价 DECR)
TIMESTAMP 指定写入时间戳 毫秒整数 当前写入 默认使用服务器时间
RETENTION 设置保留周期 ≥ 0(毫秒) 仅首次创建生效 序列级 已存在 key 不生效
ENCODING 存储编码 COMPRESSED / UNCOMPRESSED 仅首次创建生效 序列级 推荐 COMPRESSED
CHUNK_SIZE 数据块大小 ≥ 128 bytes 仅首次创建生效 序列级 高频写入可调大
DUPLICATE_POLICY 默认重复时间戳策略 BLOCK / FIRST / LAST / MIN / MAX / SUM 仅首次创建生效 序列级 对计数器通常设 SUM
IGNORE 忽略微小变化 两个阈值 仅首次创建生效 序列级 计数器一般不使用
LABELS 标签 键值对 仅首次创建生效 序列级 用于 MGET / MRANGE
  • 如果 key 不存在,TS.INCRBY 会 隐式创建时间序列。

  • 如果没有指定 TIMESTAMP,则自动使用服务器当前时间。

  • 写入逻辑等价于:读取最新值 + addend → 写回一个新样本。

  • 示例

1
2
3
4
5
6
7
# 对最新时间戳的值做自增
TS.INCRBY ts:cpu:server1 10
## 输出
(integer) 1767778308125

# 指定时间戳,TIMESTAMP 必须大于或等于当前时间序列中最大的时间戳
TS.INCRBY ts:cpu:server1 5 TIMESTAMP 1767778308126

4️⃣ TS.DECRBY : 对最新时间戳的值做自减(不存在则创建新样本)

  • TS.INCRBY 相似,不再赘述。

  • 实际上 TS.INCRBY 中设置 addend 为负数 就是 TS.DECR

三、数据查询(单序列)类

命令 功能说明 典型使用场景
TS.GET 获取某个时间序列最新(最大 timestamp)的样本 获取当前最新指标值
TS.RANGE 按时间正序查询一个时间序列的区间数据 绘图、趋势分析
TS.REVRANGE 按时间逆序查询一个时间序列的区间数据 获取最近 N 条数据

1️⃣ TS.GET : 获取某个时间序列最新(最大 timestamp)的样本

  • 语法:

1
TS.GET key [LATEST]
  • 参数说明:

参数 作用
key 时间序列 Key
LATEST 获取最新样本
  • LATEST 说明

    • 当一个时间序列是经过聚合(compaction)处理的时,LATEST 参数会生效。使用 LATEST 时,TS.GET 会返回最新(可能是部分的)桶的聚合值。不使用 LATEST 时,TS.GET 不会返回最新(可能是部分的)桶的值。当时间序列不是聚合的时,LATEST 会被忽略。
    • 最新桶中的数据可能是不完整的。只有当有新的样本到来并开启一个新的最新桶时,原桶才会被关闭并进行聚合。然而,在某些情况下,也需要获取最新(可能是部分的)桶的聚合值,此时就可以使用 LATEST。
  • 示例:

1
2
3
4
TS.GET ts:cpu:server1 LATEST
## 输出
1) (integer) 1767778308126
2) 115.5

2️⃣ TS.RANGE : 按时间正序查询一个时间序列的区间数据

  • 语法:

1
2
3
4
5
6
TS.RANGE key fromTimestamp toTimestamp
[LATEST]
[FILTER_BY_TS ts...]
[FILTER_BY_VALUE min max]
[COUNT count]
[[ALIGN align] AGGREGATION aggregator bucketDuration [BUCKETTIMESTAMP bt] [EMPTY]]
  • 参数说明:

参数 类型 说明 可选值 / 说明
key string 时间序列的键名 必选
fromTimestamp integer 查询起始时间戳,-: 最小值 必选
toTimestamp integer 查询结束时间戳 ,+: 最大值 必选
LATEST flag 当时间序列是 compaction 时,返回最新(可能部分)的桶的聚合值 可选
FILTER_BY_TS ts... list of integers 只返回指定时间戳的样本 可选
FILTER_BY_VALUE min max range 只返回值在 [min, max] 区间的样本 可选
COUNT count integer 限制返回的样本数量(最多 count 个) 可选
ALIGN align string 对齐聚合桶的时间戳(如 startend、自定义时间戳) 可选,需与 AGGREGATION 一起使用
AGGREGATION aggregator bucketDuration aggregation 对数据进行聚合计算,aggregator 为聚合函数(如 avg, sum, min, max 等),bucketDuration 为桶的时长 可选
BUCKETTIMESTAMP bt string 聚合桶时间戳选择,bt 可为 startend 可选
EMPTY flag 即使桶为空也返回结果 可选
  • 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 查询时间序列 ts:cpu:server1 的区间数据
TS.RANGE ts:cpu:server1 0 1767778308126
## 输出
1) 1) (integer) 1767777655255
2) 80.5
2) 1) (integer) 1767777807933
2) 70.5
3) 1) (integer) 1767777873866
2) 80.5
4) 1) (integer) 1767777965870
2) 80.5
5) 1) (integer) 1767778300909
2) 90.5
6) 1) (integer) 1767778308125
2) 105.5
7) 1) (integer) 1767778308126
2) 115.5
# 查询时间序列 ts:cpu:server1 的区间数据,并返回聚合结果,求1000ms内平均值
TS.RANGE ts:cpu:server1 - + AGGREGATION avg 1000
## 输出
1) 1) (integer) 1767777655000
2) 80.5
2) 1) (integer) 1767777807000
2) 70.5
3) 1) (integer) 1767777873000
2) 80.5
4) 1) (integer) 1767777965000
2) 80.5
5) 1) (integer) 1767778300000
2) 90.5
6) 1) (integer) 1767778308000
2) 110.5

3️⃣ TS.REVRANGE : 按时间逆序查询一个时间序列的区间数据

  • 与 TS.RANGE 类似,只是返回结果是倒序的

  • 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
TS.REVRANGE ts:cpu:server1 0 1767778308126
## 输出
1) 1) (integer) 1767778308126
2) 115.5
2) 1) (integer) 1767778308125
2) 105.5
3) 1) (integer) 1767778300909
2) 90.5
4) 1) (integer) 1767777965870
2) 80.5
5) 1) (integer) 1767777873866
2) 80.5
6) 1) (integer) 1767777807933
2) 70.5
7) 1) (integer) 1767777655255
2) 80.5

四、数据查询(多序列 / 聚合)类

命令 功能说明 典型使用场景
TS.MGET 根据标签过滤,获取多个时间序列的最新值 批量获取多个实例的当前指标
TS.MRANGE 按标签过滤,正序查询多个时间序列的区间数据 多维指标分析、聚合
TS.MREVRANGE 按标签过滤,逆序查询多个时间序列的区间数据 最近数据聚合分析
TS.QUERYINDEX 根据标签过滤,返回匹配的时间序列 key 列表 发现有哪些指标符合条件

1️⃣ TS.MGET : 根据标签过滤,获取多个时间序列的最新值

  • 语法:

1
TS.MGET [LATEST] [WITHLABELS | <SELECTED_LABELS label...>] FILTER filterExpr...
  • 参数说明:

参数 类型 说明 可选值 / 说明
LATEST flag 对 compaction 类型的时间序列,返回最新(可能部分)的样本值 可选
WITHLABELS flag 返回样本的同时附带时间序列的所有标签 可选
<SELECTED_LABELS label...> list 返回样本时只附带指定标签 可选,不能与 WITHLABELS 一起使用
FILTER filterExpr... list of expressions 过滤时间序列,根据标签匹配规则筛选出符合条件的序列 必选,支持标签匹配表达式,如 sensor=temperatureregion=*
  • 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 获取所有时间序列的最新值,根据标签过滤
TS.MGET WITHLABELS FILTER metric=cpu
## 输出
1) 1) "ts:cpu:server1"
2) 1) 1) "host"
2) "server1"
2) 1) "metric"
2) "cpu"
3) 1) "env"
2) "prod"
3) 1) (integer) 1767778308126
2) 115.5
2) 1) "ts:cpu:server2"
2) 1) 1) "host"
2) "server1"
2) 1) "metric"
2) "cpu"
3) 1) (integer) 1767777965870
2) 90.5
3) 1) "ts:cpu:server3"
2) 1) 1) "host"
2) "server1"
2) 1) "metric"
2) "cpu"
3) 1) (integer) 1767777965870
2) 70.5

2️⃣ TS.MRANGE : 按标签过滤,正序查询多个时间序列的区间数据

  • 语法:

1
2
3
4
5
6
7
8
9
TS.MRANGE fromTimestamp toTimestamp
[LATEST]
[FILTER_BY_TS ts...]
[FILTER_BY_VALUE min max]
[WITHLABELS | <SELECTED_LABELS label...>]
[COUNT count]
[[ALIGN align] AGGREGATION aggregator bucketDuration [BUCKETTIMESTAMP bt] [EMPTY]]
FILTER filterExpr...
[GROUPBY label REDUCE reducer]
  • 参数说明:

参数 类型 说明 可选值 / 说明
fromTimestamp integer 查询起始时间戳,-: 最小值 必选
toTimestamp integer 查询结束时间戳,+: 最大值 必选
LATEST flag 对 compaction 类型的时间序列,返回最新(可能部分)的桶的聚合值 可选
FILTER_BY_TS ts... list of integers 只返回指定时间戳的样本 可选
FILTER_BY_VALUE min max range 只返回值在 [min, max] 区间的样本 可选
WITHLABELS flag 返回样本的同时附带时间序列的所有标签 可选
<SELECTED_LABELS label...> list 返回样本时只附带指定标签 可选,不能与 WITHLABELS 一起使用
COUNT count integer 限制返回的样本数量(最多 count 个) 可选
ALIGN align string 对齐聚合桶的时间戳(如 startend 或自定义时间戳) 可选,需与 AGGREGATION 一起使用
AGGREGATION aggregator bucketDuration aggregation 对数据进行聚合计算,aggregator 为聚合函数(如 avg, sum, min, max 等),bucketDuration 为桶的时长 可选
BUCKETTIMESTAMP bt string 聚合桶时间戳选择,bt 可为 startend 可选
EMPTY flag 即使桶为空也返回结果 可选
FILTER filterExpr... list of expressions 过滤时间序列,根据标签匹配规则筛选出符合条件的序列 必选
GROUPBY label REDUCE reducer aggregation 对返回结果按指定标签分组并应用 reducer 聚合函数(如 SUM, MIN, MAX 等) 可选
  • 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
TS.MRANGE - + FILTER metric=cpu
## 输出
1) 1) "ts:cpu:server1"
2) (empty array)
3) 1) 1) (integer) 1767777655255
2) 80.5
2) 1) (integer) 1767777807933
2) 70.5
3) 1) (integer) 1767777873866
2) 80.5
4) 1) (integer) 1767777965870
2) 80.5
5) 1) (integer) 1767778300909
2) 90.5
6) 1) (integer) 1767778308125
2) 105.5
7) 1) (integer) 1767778308126
2) 115.5
2) 1) "ts:cpu:server2"
2) (empty array)
3) 1) 1) (integer) 1767777965870
2) 90.5
3) 1) "ts:cpu:server3"
2) (empty array)
3) 1) 1) (integer) 1767777965870
2) 70.5

# 按标签聚合
TS.MRANGE - +
AGGREGATION avg 1000
FILTER metric=cpu
GROUPBY host REDUCE avg
## 输出
1) 1) "host=server1"
2) (empty array)
3) 1) 1) (integer) 1767777655000
2) 80.5
2) 1) (integer) 1767777807000
2) 70.5
3) 1) (integer) 1767777873000
2) 80.5
4) 1) (integer) 1767777965000
2) 80.5
5) 1) (integer) 1767778300000
2) 90.5
6) 1) (integer) 1767778308000
2) 110.5

3️⃣ TS.MREVRANGE : 按标签过滤,逆序查询多个时间序列的区间数据

  • 与 TS.MRANGE 类似,只是查询结果是逆序的

4️⃣ TS.QUERYINDEX : 根据标签过滤,返回匹配的时间序列 key 列表

  • 语法:

1
S.QUERYINDEX filterExpr...
  • 示例:

1
2
3
4
5
TS.QUERYINDEX metric=cpu host=server1
## 输出
1) "ts:cpu:server1"
2) "ts:cpu:server2"
3) "ts:cpu:server3"

五、数据删除与维护类

命令 功能说明 典型使用场景
TS.DEL 删除某个时间序列在指定时间范围内的样本 清理异常数据、历史数据修正
  • 语法

1
TS.DEL key fromTimestamp toTimestamp
  • 示例:

1
2
3
TS.DEL ts:cpu:server1 0 1767777965870
## 输出
(integer) 4 # 删除了 4 个样本

六、元数据与状态查询类

命令 功能说明 典型使用场景
TS.INFO 返回时间序列的元信息与统计信息 排查问题、容量评估、监控状态
  • 语法

1
2
TS.INFO key [DEBUG]
# DEBUG: 显示更为详细的信息
  • 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
TS.INFO ts:cpu:server1
## 输出
1) totalSamples
2) (integer) 3
3) memoryUsage
4) (integer) 9184
5) firstTimestamp
6) (integer) 1767778300909
7) lastTimestamp
8) (integer) 1767778308126
9) retentionTime
10) (integer) 7200000
11) chunkCount
12) (integer) 1
13) chunkSize
14) (integer) 8192
15) chunkType
16) compressed
17) duplicatePolicy
18) last
19) labels
20) 1) 1) "host"
2) "server1"
2) 1) "metric"
2) "cpu"
3) 1) "env"
2) "prod"
21) sourceKey
22) (nil)
23) rules
24) (empty array)
25) ignoreMaxTimeDiff
26) (integer) 1000
27) ignoreMaxValDiff
28) "0.1"

真实案例

场景说明

  • 假设我们有一个 IoT 设备监控系统,每台设备每分钟会上报一次温度和湿度数据。我们希望:

    • 存储每台设备的时间序列数据。
    • 查询最近一小时的数据。
    • 统计每 5 分钟的平均温度和湿度。
    • 获取最新的温度值。

步骤

    1. 创建时间序列
1
2
3
4
5
6
7
8
9
10
# 创建设备 device:1001 的温度时间序列
TS.CREATE device:1001:temperature RETENTION 86400000 LABELS device_id 1001 type temperature

# 创建设备 device:1001 的湿度时间序列
TS.CREATE device:1001:humidity RETENTION 86400000 LABELS device_id 1001 type humidity

## 说明:
# RETENTION 86400000:数据保留 24 小时(单位毫秒)。
# LABELS:方便后续按标签聚合查询。
# TS.CREATE 用于创建时间序列 key。
    1. 插入数据
1
2
3
4
# 假设时间戳为当前毫秒
TS.ADD device:1001:temperature * 26.5
TS.ADD device:1001:humidity * 60.2
# 此处假设会每分钟插入一次数据
    1. 查询时间范围数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 获取 过去一小时的温度数据:
# 过去一小时的时间戳可以这样获得
EVAL "return redis.call('TIME')[1]*1000 - 3600000" 0
## 输出
(integer) 1767777794000

TS.RANGE device:1001:temperature 1767777794000 +
## 说明
# -3600000 表示一小时前。
# + 表示到现在。
# 返回结果为 [timestamp, value] 数组。
## 输出
1) 1) (integer) 1767781256846
2) 26.5
    1. 聚合查询(Downsampling)
1
2
3
4
5
# 统计 每 5 分钟平均温度:
TS.RANGE device:1001:temperature 1767777794000 + AGGREGATION avg 300000
# 说明:
# AGGREGATION avg 300000 表示每 300,000 ms(5 分钟)聚合一次。
# RedisTimeSeries 支持多种聚合函数:avg, sum, min, max, count。
    1. 获取最新值
1
2
3
4
5
# 获取最新的温度值:
TS.GET device:1001:temperature
# 说明
# TS.GET 会返回最新一个数据点 [timestamp, value]。
# 如果使用了压缩策略 LATEST,返回的值可能是当前聚合桶的值。
    1. 按标签查询
1
2
3
4
5
6
7
8
9
10
# 如果我们想获取 所有设备的温度平均值(假设有很多设备):
TS.MRANGE - + AGGREGATION avg 300000 FILTER type=temperature
# 说明:
# TS.MRANGE 支持多 key 查询,并且可以按标签过滤。
# 聚合函数可以对每个匹配 key 单独计算。
# 输出
1) 1) "device:1001:temperature"
2) (empty array)
3) 1) 1) (integer) 1767781200000
2) 26.5