TairTS是基于Redis Module开发的时序数据结构,提供低时延、高并发的内存读写访问,及快速地过滤、聚合查询功能,集存储与计算为一体,在简化了处理时序数据流程的同时,大幅度提高了性能。
TairTS简介
相比RedisTimeSeries,TairTS提供了更丰富的功能:
- 通过Pkey(额外一层Hash结构)结构,轻松实现Pkey级别(多时间线)聚合查询。 - 例如您可以在foo(Pkey)中创建以各项指标名称与设备ID命名的Skey,例如temperature:1、pressure:1、distance:1等,可通过TairTS自带的EXTS.S.MRANGE命令轻松获取设备ID为1的自定义监控信息,而使用RedisTimeSeries则需要在业务逻辑代码中嵌入大量数据聚合运算才能实现该功能。 - 图 1. TairTS与RedisTS数据结构对比图  - TairTS数据结构解析: - Pkey(一组时间线):TairTS数据结构,可包含多个Skey。 
- Skey(一条时间线):包含多个固定容量的Chunk,每个Skey可设置不同的Label(标签),可通过Label在海量数据中快速过滤目标Skey。 
- Chunk(数据块):可存储多个Datapoint。 - Chunk的容量支持自定义,若不开启压缩,最多存储256个Datapoint;若开启压缩,则能存储超过256个。 
- Chunk为最小的过期单元,即单个Chunk中所有Datapoint都过期后才会删除该Chunk。 
 
- Datapoint(时序数据):包含一个时间戳和一个value数据(double类型)。 
 
- 支持降采样、属性过滤、分批查询、多种数值函数等条件下的聚合操作,将批量查询与聚合计算集成到单条命令中,减少网络交互,实现毫秒级响应。 
- 支持对历史时序数据的更新或累加。 
- 支持时间线级别的TTL设定,保证每条时间线都可以按时间窗口自动滚动。 
- 采用高效的Gorilla压缩算法与特定存储,极大降低存储成本。 
典型场景
- 监控数据的存储与计算 
- 基于时间窗口的数据分析 
- IoT(物联网)数据分析与处理 
- 热点消息缓存 
- APM秒级监控 
- 限流风控 
最佳实践
前提条件
注意事项
- 操作对象为Tair实例中的TairTS数据。 
- TairTS的优势为实时、高并发的写入与查询性能,缺陷为存储容量有限,请合理设置TTL,及时淘汰过期数据。 
Breaking Change公告:
2024年07月22日发布Tair内存型(兼容Redis 6.0)24.7.0.0版本,该版本中新增了ts-auto-del-empty-skey-enable参数,默认为yes,表示当Skey中的所有数据点都过期时,会自动删除Skey。但在Tair内存型(兼容Redis 6.0)24.7.0.0之前的版本中,默认不会删除数据点已过期的Skey。
在Tair内存型(兼容Redis 6.0)实例使用TairTS前,建议将实例升级至24.7.0.0及以上版本,并确认、手动调整ts-auto-del-empty-skey-enable参数的策略,避免因默认行为的改变对业务产生影响。
命令列表
表 1. TairTS命令
| 类型 | 命令 | 语法 | 说明 | 
| 基础写操作 | 
 | 创建一个新的Pkey(TairTS数据结构),若Pkey已存在则创建失败。 | |
| 
 | 在指定的Pkey中创建一个Skey,若Pkey不存在则会自动创建,若Skey已经存在则创建失败。 说明  您可以在创建Skey时设置其相关属性,例如过期时间、是否开启压缩等。 | ||
| 
 | 修改指定Skey的元数据信息,当前仅支持修改过期时间(DATA_ET)。 | ||
| 
 | 向Skey中插入一条Datapoint数据。若Pkey或Skey不存在则会自动创建,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | ||
| 
 | 在指定Pkey的多个Skey中分别插入一条Datapoint数据。若Pkey或Skey不存在则会自动创建,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | ||
| 
 | 向Skey中插入一条Datapoint数据,该命令中的value将与Skey中最近Datapoint的value值相加实现递增,也可以指定该命令中的value为负数实现递减。若Pkey或Skey不存在则会自动创建,默认初始值为0,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | ||
| 
 | 在指定Pkey的多个Skey分别插入一条Datapoint数据,该命令中的value将分别与各个Skey中最近Datapoint的value值相加实现递增,也可以指定该命令中的value为负数实现相减。若Pkey或Skey不存在则会自动创建,默认初始值为0,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | ||
| 
 | 删除指定Pkey中的单个Skey,并删除目标Skey中所有的Datapoint数据。 | ||
| 基础读操作 | 
 | 查询指定Skey中最新的Datapoint数据。 | |
| 
 | 查询指定Skey的元数据信息,包含Datapoint数量、最近Datapoint的时间戳与value值、Skey的标签信息等信息。 | ||
| 
 | 在Pkey中自定义过滤条件(filter),查询目标Skey。 | ||
| 聚合操作 | 
 | 在Skey中查询指定时间内(包含指定时间点)的Datapoint数据。 | |
| 
 | 在Skey中自定义过滤条件(filter)与查询时间点(包含指定时间点),查询目标Datapoint数据。 | ||
| 
 | 在Pkey层级对符合过滤条件(filter)的Datapoint数据进行聚合,若您指定了Skey层级的聚合,则会优先进行Skey层级聚合(效果与EXTS.S.MRANGE命令相同),再从Pkey层级对第一次聚合结果进行二次聚合。 | ||
| 并发写操作 | 
 | 修改指定Skey中Datapoint数据的value值。若Pkey或Skey不存在则会自动创建,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | |
| 
 | 批量修改多个指定Skey中Datapoint数据的value值。若Pkey或Skey不存在则会自动创建,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | ||
| 
 | 该命令中的value值会与指定Skey中Datapoint数据的value相加实现递增,也可以指定该命令中的value为负数实现递减。若Pkey或Skey不存在则会自动创建,默认初始值为0,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | ||
| 
 | 批量修改多个指定Skey中Datapoint数据的value值,该命令中的value值会与指定Skey中Datapoint数据的value相加实现递增,也可以指定该命令中的value为负数实现递减。若Pkey或Skey不存在则会自动创建,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | ||
| 通用 | 
 | 使用原生Redis的DEL命令可以删除一条或多条TairTS数据。 | 
本文的命令语法定义如下:
- 大写关键字:命令关键字。
- 斜体:变量。
- [options]:可选参数,不在括号中的参数为必选。
- A|B:该组参数互斥,请进行二选一或多选一。
- ...:前面的内容可重复。
EXTS.P.CREATE
| 类别 | 说明 | 
| 语法 | 
 | 
| 时间复杂度 | O(1) | 
| 命令描述 | 创建一个新的Pkey(TairTS数据结构),若Pkey已存在则创建失败。 | 
| 选项 | 
 | 
| 返回值 | 
 | 
| 示例 | 命令示例: 返回示例:  | 
EXTS.S.CREATE
| 类别 | 说明 | 
| 语法 | 
 | 
| 时间复杂度 | O(1) | 
| 命令描述 | 在指定的Pkey中创建一个Skey,若Pkey不存在则会自动创建,若Skey已经存在则创建失败。 说明  您可以在创建Skey时设置其相关属性,例如过期时间、是否开启压缩等。 | 
| 选项 | 
 | 
| 返回值 | 
 | 
| 示例 | 命令示例: 返回示例:  | 
EXTS.S.ALTER
| 类别 | 说明 | 
| 语法 | 
 | 
| 时间复杂度 | O(1) | 
| 命令描述 | 修改指定Skey的元数据信息,当前仅支持修改过期时间(DATA_ET)。 | 
| 选项 | 
 | 
| 返回值 | 
 | 
| 示例 | 命令示例: 返回示例:  | 
EXTS.S.ADD
| 类别 | 说明 | 
| 语法 | 
 | 
| 时间复杂度 | O(1) | 
| 命令描述 | 向Skey中插入一条Datapoint数据。若Pkey或Skey不存在则会自动创建,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | 
| 选项 | 
 | 
| 返回值 | 
 | 
| 示例 | 命令示例: 返回示例:  | 
EXTS.S.MADD
| 类别 | 说明 | 
| 语法 | 
 | 
| 时间复杂度 | O(n),其中n为keynumber。 | 
| 命令描述 | 在指定Pkey的多个Skey中分别插入一条Datapoint数据。若Pkey或Skey不存在则会自动创建,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | 
| 选项 | 
 | 
| 返回值 | 
 | 
| 示例 | 命令示例: 返回示例:  | 
EXTS.S.INCRBY
| 类别 | 说明 | 
| 语法 | 
 | 
| 时间复杂度 | O(1) | 
| 命令描述 | 向Skey中插入一条Datapoint数据,该命令中的value将与Skey中最近Datapoint的value值相加实现递增,也可以指定该命令中的value为负数实现递减。若Pkey或Skey不存在则会自动创建,默认初始值为0,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | 
| 选项 | 
 | 
| 返回值 | 
 | 
| 示例 | 提前执行 命令示例: 返回示例: 若此时执行  | 
EXTS.S.MINCRBY
| 类别 | 说明 | 
| 语法 | 
 | 
| 时间复杂度 | O(n),其中n为keynumber。 | 
| 命令描述 | 在指定Pkey的多个Skey分别插入一条Datapoint数据,该命令中的value将分别与各个Skey中最近Datapoint的value值相加实现递增,也可以指定该命令中的value为负数实现相减。若Pkey或Skey不存在则会自动创建,默认初始值为0,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | 
| 选项 | 
 | 
| 返回值 | 
 | 
| 示例 | 命令示例: 返回示例:  | 
EXTS.S.DEL
| 类别 | 说明 | 
| 语法 | 
 | 
| 时间复杂度 | O(1) | 
| 命令描述 | 删除指定Pkey中的单个Skey,并删除目标Skey中所有的Datapoint数据。 | 
| 选项 | 
 | 
| 返回值 | 
 | 
| 示例 | 命令示例: 返回示例:  | 
EXTS.S.GET
| 类别 | 说明 | 
| 语法 | 
 | 
| 时间复杂度 | O(1) | 
| 命令描述 | 查询指定Skey中最新的Datapoint数据。 | 
| 选项 | 
 | 
| 返回值 | 
 | 
| 示例 | 命令示例: 返回示例:  | 
EXTS.S.INFO
| 类别 | 说明 | 
| 语法 | 
 | 
| 时间复杂度 | O(1) | 
| 命令描述 | 查询指定Skey的元数据信息,包含Datapoint数量、最近Datapoint的时间戳与value值、Skey的标签信息等信息。 | 
| 选项 | 
 | 
| 返回值 | 
 | 
| 示例 | 命令示例: 返回示例:  | 
EXTS.S.QUERYINDEX
| 类别 | 说明 | 
| 语法 | 
 | 
| 时间复杂度 | O(n),其中n为过滤条件中的最大集合数。 | 
| 命令描述 | 在Pkey中自定义过滤条件(filter),查询目标Skey。 | 
| 选项 | 
 | 
| 返回值 | 
 | 
| 示例 | 命令示例: 返回示例:  | 
EXTS.S.RANGE
| 类别 | 说明 | 
| 语法 | 
 | 
| 时间复杂度 | O(n),其中n为目标Datapoint的数据块个数。 | 
| 命令描述 | 在Skey中查询指定时间内(包含指定时间点)的Datapoint数据。 | 
| 选项 | 
 | 
| 返回值 | 
 | 
| 示例 | 命令示例: 返回示例:  | 
EXTS.S.MRANGE
| 类别 | 说明 | 
| 语法 | 
 | 
| 时间复杂度 | O(n),其中n为目标Datapoint的数据块个数。 | 
| 命令描述 | 在Skey中自定义过滤条件(filter)与查询时间点(包含指定时间点),查询目标Datapoint数据。 | 
| 选项 | 
 | 
| 返回值 | 
 | 
| 示例 | 命令示例: 返回示例:  | 
EXTS.P.RANGE
| 类别 | 说明 | 
| 语法 | 
 | 
| 时间复杂度 | O(n),其中n为目标Datapoint的数据块个数。 | 
| 命令描述 | 在Pkey层级对符合过滤条件(filter)的Datapoint数据进行聚合,若您指定了Skey层级的聚合,则会优先进行Skey层级聚合(效果与EXTS.S.MRANGE命令相同),再从Pkey层级对第一次聚合结果进行二次聚合。 | 
| 选项 | 
 | 
| 返回值 | 
 | 
| 示例 | 命令示例: 返回示例:  | 
EXTS.S.RAW_MODIFY
| 类别 | 说明 | 
| 语法 | 
 | 
| 时间复杂度 | O(1) | 
| 命令描述 | 修改指定Skey中Datapoint数据的value值。若Pkey或Skey不存在则会自动创建,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | 
| 选项 | 
 | 
| 返回值 | 
 | 
| 示例 | 命令示例: 返回示例:  | 
EXTS.S.RAW_MMODIFY
| 类别 | 说明 | 
| 语法 | 
 | 
| 时间复杂度 | O(n),其中n为keynumber。 | 
| 命令描述 | 批量修改多个指定Skey中Datapoint数据的value值。若Pkey或Skey不存在则会自动创建,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | 
| 选项 | 
 | 
| 返回值 | 
 | 
| 示例 | 命令示例: 返回示例:  | 
EXTS.S.RAW_INCRBY
| 类别 | 说明 | 
| 语法 | 
 | 
| 时间复杂度 | O(1) | 
| 命令描述 | 该命令中的value值会与指定Skey中Datapoint数据的value相加实现递增,也可以指定该命令中的value为负数实现递减。若Pkey或Skey不存在则会自动创建,默认初始值为0,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | 
| 选项 | 
 | 
| 返回值 | 
 | 
| 示例 | 提前执行 命令示例: 返回示例: 若此时执行  | 
EXTS.S.RAW_MINCRBY
| 类别 | 说明 | 
| 语法 | 
 | 
| 时间复杂度 | O(n),其中n为keynumber。 | 
| 命令描述 | 批量修改多个指定Skey中Datapoint数据的value值,该命令中的value值会与指定Skey中Datapoint数据的value相加实现递增,也可以指定该命令中的value为负数实现递减。若Pkey或Skey不存在则会自动创建,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | 
| 选项 | 
 | 
| 返回值 | 
 | 
| 示例 | 命令示例: 返回示例:  | 
索引过滤语法
您可以根据Skey的标签(LABELS)过滤目标Skey。过滤条件(filter)的语法如下:
构造filter时,支持如下所有命令及组合使用,但必须存在EQ、CONTAINS、LIST_MATCH逻辑中的任意一个。
| filter命令 | 说明 | 逻辑 | 
| 
 | 标签L等于V。 | EQ(equals) | 
| 
 | 标签L不为NULL, 即目标Skey包含标签L。 | CONTAINS | 
| 
 | 标签L为v1或v2等。 | LIST_TMATCH | 
| 
 | 标签L不等于V。 | NOEQ(equals) | 
| 
 | 标签L为NULL, 即目标Skey不包含标签L。 | NOCONTAINS | 
| 
 | 标签L不为v1和v2等。 | LIST_NOTMATCH | 
聚合功能语法
聚合操作会对采集间隔(timeBucket)范围内的数据进行聚合,支持如下聚合类型:
- MAX:最大值
- MIN:最小值
- AVG:平均值
- SUM:求和
- FIRST:第一个值
- LAST:最后一个值
- RANGE:范围(最大值 - 最小值)
- COUNT:value数量
- STD.P:总体方差
- STD.S:样本方差
- VAR.P:总体标准差
- VAR.S:样本标准差
常见问题
- Q:为什么部分Tair内存型(兼容Redis 5.0)版本的CHUNK_SIZE默认值比较小? - A:Tair内存型(兼容Redis 5.0)实例在25.2.0.0版本起,CHUNK_SIZE的默认值为256,在此之前的版本都是32。