TairTS是基于Redis Module开发的时序数据结构,提供低时延、高并发的内存读写访问,及快速地过滤、聚合查询功能,集存储与计算为一体,在简化了处理时序数据流程的同时,大幅度提高了性能。
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。
- Chunk为最小的过期单元,即单个Chunk中所有Datapoint都过期后才会删除该Chunk。
- DataPoint(时序数据):包含一个时间戳和一个value数据(double类型)。
- 支持降采样、属性过滤、分批查询、多种数值函数等条件下的聚合操作,将批量查询与聚合计算集成到单条命令中,减少网络交互,实现毫秒级响应。
- 支持对历史时序数据的更新或累加。
- 支持时间线级别的TTL设定,保证每条时间线都可以按时间窗口自动滚动。
- 采用高效的Gorilla压缩算法与特定存储,极大降低存储成本。
- 监控数据的存储与计算
- APM秒级监控
- IoT(物联网)数据分析与处理
- 限流风控
- 热点消息的缓存
- 时间窗口函数
最佳实践
基于TairTS实现秒级监控前提条件
注意事项
- 操作对象为Tair实例中的TairTS数据。
- TairTS的优势为实时、高并发的写入与查询性能,缺陷为存储容量有限,请合理设置TTL,及时淘汰过期数据。
- 为节省内存空间,关于设置
CHUNK_SIZE
的建议如下:- 若Skey(时间线)的平均数据点大于5,000个,设置
CHUNK_SIZE
为256(默认值)。 - 若Skey(时间线)的平均数据点小于5,000个,设置
CHUNK_SIZE
为平均数据点个数 / 20。例如某Skey的平均数据点为1,000,可以设置CHUNK_SIZE
为50。
- 若Skey(时间线)的平均数据点大于5,000个,设置
命令列表
类型 | 命令 | 语法 | 说明 |
---|---|---|---|
基础写操作 | EXTS.P.CREATE | EXTS.P.CREATE Pkey | 创建一个新的Pkey(TairTS数据结构),若Pkey已存在则创建失败。 |
EXTS.S.CREATE | EXTS.S.CREATE Pkey Skey [DATA_ET time] [CHUNK_SIZE size] [UNCOMPRESSED] [LABELS label1 val1 label2 val2 ...] | 在指定的Pkey中创建一个Skey,若Pkey不存在则会自动创建,若Skey已经存在则创建失败。 说明 您可以在创建Skey时设置其相关属性,例如过期时间、是否开启压缩等。 | |
EXTS.S.ALTER | EXTS.S.ALTER Pkey Skey [DATA_ET time] | 修改指定Skey的元数据信息,当前仅支持修改过期时间(DATA_ET)。 | |
EXTS.S.ADD | EXTS.S.ADD Pkey Skey ts value [DATA_ET time] [CHUNK_SIZE size] [UNCOMPRESSED] [LABELS label1 val1 ...] | 向Skey中插入一条Datapoint数据。若Pkey或Skey不存在则会自动创建,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | |
EXTS.S.MADD | EXTS.S.MADD Pkey keynumber Skey ts value [Skey ts value ...] [DATA_ET time] [CHUNK_SIZE size] [UNCOMPRESSED] [LABELS label1 val1 ...] | 在指定Pkey的多个Skey分中别插入一条Datapoint数据。若Pkey或Skey不存在则会自动创建,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | |
EXTS.S.INCRBY | EXTS.S.INCRBY Pkey Skey ts value [DATA_ET time] [CHUNK_SIZE size] [UNCOMPRESSED] [LABELS label1 val1 ...] | 向Skey中插入一条Datapoint数据,该命令中的value将与Skey中最近Datapoint的value值相加实现递增,也可以指定该命令中的value为负数实现递减。若Pkey或Skey不存在则会自动创建,默认初始值为0,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | |
EXTS.S.MINCRBY | EXTS.S.MINCRBY Pkey keynumber Skey ts value [Skey ts value ...] [DATA_ET time] [CHUNK_SIZE size] [UNCOMPRESSED] [LABELS label1 val1 ...] | 在指定Pkey的多个Skey分别插入一条Datapoint数据,该命令中的value将分别与各个Skey中最近Datapoint的value值相加实现递增,也可以指定该命令中的value为负数实现相减。若Pkey或Skey不存在则会自动创建,默认初始值为0,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | |
EXTS.S.DEL | EXTS.S.DEL Pkey Skey | 删除指定Pkey中的单个Skey,并删除目标Skey中所有的Datapoint数据。 | |
基础读操作 | EXTS.S.GET | EXTS.S.GET Pkey Skey | 查询指定Skey中最新的Datapoint数据。 |
EXTS.S.INFO | EXTS.S.INFO Pkey Skey | 查询指定Skey的元数据信息,包含Datapoint数量、最近Datapoint的时间戳与value值、Skey的标签信息等信息。 | |
EXTS.S.QUERYINDEX | EXTS.S.QUERYINDEX Pkey filter1 [filter2 ...] | 在Pkey中自定义过滤条件(filter),查询目标Skey。 | |
聚合操作 | EXTS.S.RANGE | EXTS.S.RANGE Pkey Skey fromTs toTs [MAXCOUNT count] [AGGREGATION aggregationType timeBucket] | 在Skey中查询指定时间内(包含指定时间点)的Datapoint数据。 |
EXTS.S.MRANGE | EXTS.S.MRANGE Pkey fromTs toTs [MAXCOUNT count] [AGGREGATION aggregationType timeBucket] [WITHLABELS] FILTER filter1 [filter2 ...] | 在Skey中自定义过滤条件(filter)与查询时间点(包含指定时间点),查询目标Datapoint数据。 | |
EXTS.P.RANGE | EXTS.P.RANGE Pkey fromTs toTs pkeyAggregationType pkeyTimeBucket [MAXCOUNT count] [AGGREGATION aggregationType timeBucket] [WITHLABELS] FILTER filter1 [filter2 ...] | 在Pkey层级对符合过滤条件(filter)的Datapoint数据进行聚合,若您指定了Skey层级的聚合,则会优先进行Skey层级聚合(效果与EXTS.S.MRANGE命令相同),再从Pkey层级对第一次聚合结果进行二次聚合。 | |
并发写操作 | EXTS.S.RAW_MODIFY | EXTS.S.RAW_MODIFY Pkey Skey ts value [DATA_ET time] [CHUNK_SIZE size] [UNCOMPRESSED] [LABELS label1 val1 ...] | 修改指定Skey中Datapoint数据的value值。若Pkey或Skey不存在则会自动创建,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 |
EXTS.S.RAW_MMODIFY | EXTS.S.RAW_MMODIFY Pkey keynumber Skey ts value [Skey ts value ...] [DATA_ET time] [CHUNK_SIZE size] [UNCOMPRESSED] [LABELS label1 val1 ...] | 批量修改多个指定Skey中Datapoint数据的value值。若Pkey或Skey不存在则会自动创建,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | |
EXTS.S.RAW_INCRBY | EXTS.S.RAW_INCRBY Pkey Skey ts value [DATA_ET time] [CHUNK_SIZE size] [UNCOMPRESSED] [LABELS label1 val1 ...] | 该命令中的value值会与指定Skey中Datapoint数据的value相加实现递增,也可以指定该命令中的value为负数实现递减。若Pkey或Skey不存在则会自动创建,默认初始值为0,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | |
EXTS.S.RAW_MINCRBY | EXTS.S.RAW_MINCRBY Pkey keynumber Skey ts value [Skey ts value ...] [DATA_ET time] [CHUNK_SIZE size] [UNCOMPRESSED] [LABELS label1 val1 ...] | 批量修改多个指定Skey中Datapoint数据的value值,该命令中的value值会与指定Skey中Datapoint数据的value相加实现递增,也可以指定该命令中的value为负数实现递减。若Pkey或Skey不存在则会自动创建,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 | |
通用 | DEL | DEL key [key ...] | 使用原生Redis的DEL命令可以删除一条或多条TairTS数据。 |
大写关键字
:命令关键字。斜体
:变量。[options]
:可选参数,不在括号中的参数为必选。A|B
:该组参数互斥,请进行二选一或多选一。...
:前面的内容可重复。
EXTS.P.CREATE
类别 | 说明 |
---|---|
语法 | EXTS.P.CREATE Pkey |
时间复杂度 | O(1) |
命令描述 | 创建一个新的Pkey(TairTS数据结构),若Pkey已存在则创建失败。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.CREATE
类别 | 说明 |
---|---|
语法 | EXTS.S.CREATE Pkey Skey [DATA_ET time] [CHUNK_SIZE size] [UNCOMPRESSED] [LABELS label1 val1 label2 val2 ...] |
时间复杂度 | O(1) |
命令描述 | 在指定的Pkey中创建一个Skey,若Pkey不存在则会自动创建,若Skey已经存在则创建失败。 说明 您可以在创建Skey时设置其相关属性,例如过期时间、是否开启压缩等。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.ALTER
类别 | 说明 |
---|---|
语法 | EXTS.S.ALTER Pkey Skey [DATA_ET time] |
时间复杂度 | O(1) |
命令描述 | 修改指定Skey的元数据信息,当前仅支持修改过期时间(DATA_ET)。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.ADD
类别 | 说明 |
---|---|
语法 | EXTS.S.ADD Pkey Skey ts value [DATA_ET time] [CHUNK_SIZE size] [UNCOMPRESSED] [LABELS label1 val1 ...] |
时间复杂度 | O(1) |
命令描述 | 向Skey中插入一条Datapoint数据。若Pkey或Skey不存在则会自动创建,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.MADD
类别 | 说明 |
---|---|
语法 | EXTS.S.MADD Pkey keynumber Skey ts value [Skey ts value ...] [DATA_ET time] [CHUNK_SIZE size] [UNCOMPRESSED] [LABELS label1 val1 ...] |
时间复杂度 | O(n),其中n为keynumber。 |
命令描述 | 在指定Pkey的多个Skey分中别插入一条Datapoint数据。若Pkey或Skey不存在则会自动创建,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.INCRBY
类别 | 说明 |
---|---|
语法 | EXTS.S.INCRBY Pkey Skey ts value [DATA_ET time] [CHUNK_SIZE size] [UNCOMPRESSED] [LABELS label1 val1 ...] |
时间复杂度 | O(1) |
命令描述 | 向Skey中插入一条Datapoint数据,该命令中的value将与Skey中最近Datapoint的value值相加实现递增,也可以指定该命令中的value为负数实现递减。若Pkey或Skey不存在则会自动创建,默认初始值为0,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 |
选项 |
|
返回值 |
|
示例 | 提前执行 命令示例:
返回示例:
若此时执行 EXTS.S.GET foo temperature 命令,将会返回如下结果:
|
EXTS.S.MINCRBY
类别 | 说明 |
---|---|
语法 | EXTS.S.MINCRBY Pkey keynumber Skey ts value [Skey ts value ...] [DATA_ET time] [CHUNK_SIZE size] [UNCOMPRESSED] [LABELS label1 val1 ...] |
时间复杂度 | O(n),其中n为keynumber。 |
命令描述 | 在指定Pkey的多个Skey分别插入一条Datapoint数据,该命令中的value将分别与各个Skey中最近Datapoint的value值相加实现递增,也可以指定该命令中的value为负数实现相减。若Pkey或Skey不存在则会自动创建,默认初始值为0,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.DEL
类别 | 说明 |
---|---|
语法 | EXTS.S.DEL Pkey Skey |
时间复杂度 | O(1) |
命令描述 | 删除指定Pkey中的单个Skey,并删除目标Skey中所有的Datapoint数据。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.GET
类别 | 说明 |
---|---|
语法 | EXTS.S.GET Pkey Skey |
时间复杂度 | O(1) |
命令描述 | 查询指定Skey中最新的Datapoint数据。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.INFO
类别 | 说明 |
---|---|
语法 | EXTS.S.INFO Pkey Skey |
时间复杂度 | O(1) |
命令描述 | 查询指定Skey的元数据信息,包含Datapoint数量、最近Datapoint的时间戳与value值、Skey的标签信息等信息。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.QUERYINDEX
类别 | 说明 |
---|---|
语法 | EXTS.S.QUERYINDEX Pkey filter1 [filter2 ...] |
时间复杂度 | O(n),其中n为过滤条件中的最大集合数。 |
命令描述 | 在Pkey中自定义过滤条件(filter),查询目标Skey。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.RANGE
类别 | 说明 |
---|---|
语法 | EXTS.S.RANGE Pkey Skey fromTs toTs [MAXCOUNT count] [AGGREGATION aggregationType timeBucket] |
时间复杂度 | O(n),其中n为目标Datapoint的数据块个数。 |
命令描述 | 在Skey中查询指定时间内(包含指定时间点)的Datapoint数据。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.MRANGE
类别 | 说明 |
---|---|
语法 | EXTS.S.MRANGE Pkey fromTs toTs [MAXCOUNT count] [AGGREGATION aggregationType timeBucket] [WITHLABELS] FILTER filter1 [filter2 ...] |
时间复杂度 | O(n),其中n为目标Datapoint的数据块个数。 |
命令描述 | 在Skey中自定义过滤条件(filter)与查询时间点(包含指定时间点),查询目标Datapoint数据。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.P.RANGE
类别 | 说明 |
---|---|
语法 | EXTS.P.RANGE Pkey fromTs toTs pkeyAggregationType pkeyTimeBucket [MAXCOUNT count] [AGGREGATION aggregationType timeBucket] [WITHLABELS] FILTER filter1 [filter2 ...] |
时间复杂度 | O(n),其中n为目标Datapoint的数据块个数。 |
命令描述 | 在Pkey层级对符合过滤条件(filter)的Datapoint数据进行聚合,若您指定了Skey层级的聚合,则会优先进行Skey层级聚合(效果与EXTS.S.MRANGE命令相同),再从Pkey层级对第一次聚合结果进行二次聚合。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.RAW_MODIFY
类别 | 说明 |
---|---|
语法 | EXTS.S.RAW_MODIFY Pkey Skey ts value [DATA_ET time] [CHUNK_SIZE size] [UNCOMPRESSED] [LABELS label1 val1 ...] |
时间复杂度 | O(1) |
命令描述 | 修改指定Skey中Datapoint数据的value值。若Pkey或Skey不存在则会自动创建,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.RAW_MMODIFY
类别 | 说明 |
---|---|
语法 | EXTS.S.RAW_MMODIFY Pkey keynumber Skey ts value [Skey ts value ...] [DATA_ET time] [CHUNK_SIZE size] [UNCOMPRESSED] [LABELS label1 val1 ...] |
时间复杂度 | O(n),其中n为keynumber。 |
命令描述 | 批量修改多个指定Skey中Datapoint数据的value值。若Pkey或Skey不存在则会自动创建,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.RAW_INCRBY
类别 | 说明 |
---|---|
语法 | EXTS.S.RAW_INCRBY Pkey Skey ts value [DATA_ET time] [CHUNK_SIZE size] [UNCOMPRESSED] [LABELS label1 val1 ...] |
时间复杂度 | O(1) |
命令描述 | 该命令中的value值会与指定Skey中Datapoint数据的value相加实现递增,也可以指定该命令中的value为负数实现递减。若Pkey或Skey不存在则会自动创建,默认初始值为0,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 |
选项 |
|
返回值 |
|
示例 | 提前执行 命令示例:
返回示例:
若此时执行 EXTS.S.GET foo temperature 命令,将会返回如下结果:
|
EXTS.S.RAW_MINCRBY
类别 | 说明 |
---|---|
语法 | EXTS.S.RAW_MINCRBY Pkey keynumber Skey ts value [Skey ts value ...] [DATA_ET time] [CHUNK_SIZE size] [UNCOMPRESSED] [LABELS label1 val1 ...] |
时间复杂度 | O(n),其中n为keynumber。 |
命令描述 | 批量修改多个指定Skey中Datapoint数据的value值,该命令中的value值会与指定Skey中Datapoint数据的value相加实现递增,也可以指定该命令中的value为负数实现递减。若Pkey或Skey不存在则会自动创建,属性(过期时间、是否开启压缩等)仅在Skey不存在并自动创建的情况下生效。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
索引过滤语法
filter命令 | 说明 | 逻辑 |
---|---|---|
L = V | 标签L等于V。 | EQ(equals) |
L != | 标签L不为NULL, 即目标Skey包含标签L。 | CONTAINS |
L = (v1,v2,...) | 标签L为v1或v2等。 | LIST_TMATCH |
L != V | 标签L不等于V。 | NOEQ(equals) |
L = | 标签L为NULL, 即目标Skey不包含标签L。 | NOCONTAINS |
L != (v1,v2,...) | 标签L不为v1和v2等。 | LIST_NOTMATCH |
聚合功能语法
聚合操作会对采集间隔(timeBucket)范围内的数据进行聚合,支持如下聚合类型:
MAX
:最大值MIN
:最小值AVG
:平均值SUM
:求和FIRST
:第一个值LAST
:最后一个值RANGE
:范围(最大值 - 最小值)COUNT
:value数量STD.P
:总体方差STD.S
:样本方差VAR.P
:总体标准差VAR.S
:样本标准差