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则需要在业务逻辑代码中嵌入大量数据聚合运算才能实现该功能。
TairTS数据结构解析:
Pkey(一组时间线):TairTS数据结构,可包含多个Skey。
Skey(一条时间线):可包含多个固定容量的Chunk,每个Skey可设置不同的Label(标签),可通过Label在海量数据中快速过滤目标Skey。
Chunk(数据块):可存储多个DataPoint。
Chunk的容量支持自定义,最多包含256个DataPoint。
Chunk为最小的过期单元,即单个Chunk中所有Datapoint都过期后才会删除该Chunk。
DataPoint(时序数据):包含一个时间戳和一个value数据(double类型)。
支持降采样、属性过滤、分批查询、多种数值函数等条件下的聚合操作,将批量查询与聚合计算集成到单条命令中,减少网络交互,实现毫秒级响应。
支持对历史时序数据的更新或累加。
支持时间线级别的TTL设定,保证每条时间线都可以按时间窗口自动滚动。
采用高效的Gorilla压缩算法与特定存储,极大降低存储成本。
典型场景
监控数据的存储与计算
APM秒级监控
IoT(物联网)数据分析与处理
限流风控
热点消息的缓存
时间窗口函数
最佳实践
前提条件
注意事项
操作对象为Tair实例中的TairTS数据。
TairTS的优势为实时、高并发的写入与查询性能,缺陷为存储容量有限,请合理设置TTL,及时淘汰过期数据。
为节省内存空间,关于设置
CHUNK_SIZE
的建议如下:若Skey(时间线)的平均数据点大于5,000个,设置
CHUNK_SIZE
为256(默认值)。若Skey(时间线)的平均数据点小于5,000个,设置
CHUNK_SIZE
为平均数据点个数 / 20。例如某Skey的平均数据点为1,000,可以设置CHUNK_SIZE
为50。
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
:样本标准差