TS.MRANGE
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]
- 可用版本
- Redis 开源版 / TimeSeries 1.0.0
- 时间复杂度
- O(n/m+k),其中 n = 数据点数量,m = 块大小(每块数据点),k = 请求范围内的数据点数量
- ACL 类别
-
@timeseries,@read,@slow,
根据过滤器向前查询多个时间序列的范围。
必需参数
fromTimestamp
范围查询的开始时间戳(毫秒级整数 Unix 时间戳),或者使用 - 表示通过 FILTER filterExpr... 的所有时间序列中的最早样本时间戳。
toTimestamp
范围查询的结束时间戳(毫秒级整数 Unix 时间戳),或者使用 + 表示通过 FILTER filterExpr... 的所有时间序列中的最新样本时间戳。
FILTER filterExpr...
根据时间序列的标签及其标签值进行过滤。每个过滤表达式具有以下语法之一:
label!=- 时间序列具有名为label的标签label=value- 时间序列具有名为label的标签,其值等于valuelabel=(value1,value2,...)- 时间序列具有名为label的标签,其值等于列表中的某个值label=- 时间序列没有名为label的标签label!=value- 时间序列没有名为label的标签,其值等于valuelabel!=(value1,value2,...)- 时间序列没有名为label的标签,其值等于列表中的任何值
- 至少需要一个语法为
label=value或label=(value1,value2,...)的过滤表达式。 - 过滤表达式是合取(AND)关系。例如,过滤器
type=temperature room=study表示时间序列是书房的温度时间序列。 - 过滤表达式中不允许使用空格,除非在值中使用引号或双引号括起来 - 例如,
x="y y"或x='(y y,z z)'。
可选参数
LATEST (自 RedisTimeSeries v1.8 起)
用于时间序列是压缩时。使用 LATEST,TS.MRANGE 还会报告最新(可能不完整)桶的压缩值,前提是该桶的开始时间落在 [fromTimestamp, toTimestamp] 范围内。不使用 LATEST 时,TS.MRANGE 不报告最新(可能不完整)桶。当时间序列不是压缩时,LATEST 会被忽略。
压缩最新桶中的数据可能不完整。只有当新的样本到来时,桶才会被 关闭 并压缩,而新的样本会 打开 一个新的 最新 桶。然而,在某些情况下,也需要获取最新(可能不完整)桶的压缩值。在这种情况下,请使用 LATEST。
FILTER_BY_TS ts... (自 RedisTimeSeries v1.6 起)
根据特定的时间戳列表过滤样本。如果样本的精确时间戳在指定列表中,并且落在 [fromTimestamp, toTimestamp] 范围内,则该样本通过过滤。
与 AGGREGATION 一起使用时:在聚合之前过滤样本。
FILTER_BY_VALUE min max (自 RedisTimeSeries v1.6 起)
根据最小值和最大值过滤样本。
与 AGGREGATION 一起使用时:在聚合之前过滤样本。
WITHLABELS
回复中包含表示时间序列元数据标签的所有标签-值对。如果未指定 WITHLABELS 或 SELECTED_LABELS,默认情况下,将报告一个空列表作为标签-值对。
SELECTED_LABELS label... (自 RedisTimeSeries v1.6 起)
返回表示时间序列元数据标签的标签-值对的子集。当每个系列存在大量标签,但只需要其中一些标签的值时使用。如果未指定 WITHLABELS 或 SELECTED_LABELS,默认情况下,将报告一个空列表作为标签-值对。
COUNT count
不与 AGGREGATION 一起使用时:限制每个时间序列报告的样本数量。
与 AGGREGATION 一起使用时:限制报告的桶数量。
ALIGN align (自 RedisTimeSeries v1.6 起)
是 AGGREGATION 的时间桶对齐控制。它通过更改定义桶的参考时间戳来控制时间桶的时间戳。
可选值包括
start或-:参考时间戳将是查询的开始间隔时间 (fromTimestamp),不能是-end或+:参考时间戳将是查询的结束间隔时间 (toTimestamp),不能是+- 一个特定的时间戳:将参考时间戳对齐到特定时间
0。
AGGREGATION aggregator bucketDuration
按每个时间序列,将样本聚合成时间桶,其中
-
aggregator采用以下聚合类型之一aggregator描述 avg所有值的算术平均值 sum所有值的总和 min最小值 max最大值 range最大值和最小值之差 count值数量 first桶中时间戳最低的值 last桶中时间戳最高的值 std.p值的总体标准差 std.s值的样本标准差 var.p值的总体方差 var.s值的样本方差 twa桶时间范围内的时加权平均值 (自 RedisTimeSeries v1.8 起) -
bucketDuration是每个桶的持续时间,以毫秒为单位。
不使用 ALIGN 时,桶的开始时间是 bucketDuration 的倍数。
使用 ALIGN align 时,桶的开始时间是 bucketDuration 的倍数加上余数 align % bucketDuration。
第一个桶的开始时间小于或等于 fromTimestamp。
[BUCKETTIMESTAMP bt] (自 RedisTimeSeries v1.8 起)
控制如何报告桶的时间戳。
bt |
报告的每个桶的时间戳 |
|---|---|
- 或 start |
桶的开始时间(默认) |
+ 或 end |
桶的结束时间 |
~ 或 mid |
桶的中间时间(如果不是整数则向下取整) |
[EMPTY] (自 RedisTimeSeries v1.8 起)
是一个标志,指定时也会报告空桶的聚合结果。
aggregator |
报告的每个空桶的值 |
|---|---|
sum, count |
0 |
last |
桶开始前的最后一个样本值。如果没有此类样本,则为 NaN。 |
twa |
根据桶开始前的最后一个样本和桶结束后的第一个样本的线性插值计算的桶时间范围内的平均值。如果没有此类样本,则为 NaN。 |
min, max, range, avg, first, std.p, std.s |
NaN |
无论 fromTimestamp 和 toTimestamp 的值如何,对于在时间序列中最早样本之前结束或在最新样本之后开始的桶,都不会报告数据。
GROUPBY label REDUCE reducer (自 RedisTimeSeries v1.6 起)
将时间序列分成组,每组包含共享相同标签值的时间序列,然后聚合每组的结果。
与 AGGREGATION 结合使用时,GROUPBY/REDUCE 在聚合阶段之后应用。
-
label是标签名称。为所有共享此标签相同值的时间序列创建一个组。 -
reducer是用于聚合每组结果的聚合类型。reducer描述 avg所有非 NaN 值的算术平均值 (自 RedisTimeSeries v1.8 起) sum所有非 NaN 值的总和 min最小非 NaN 值 max最大非 NaN 值 range最大非 NaN 值和最小非 NaN 值之差 (自 RedisTimeSeries v1.8 起) count非 NaN 值数量 (自 RedisTimeSeries v1.8 起) std.p所有非 NaN 值的总体标准差 (自 RedisTimeSeries v1.8 起) std.s所有非 NaN 值的样本标准差 (自 RedisTimeSeries v1.8 起) var.p所有非 NaN 值的总体方差 (自 RedisTimeSeries v1.8 起) var.s所有非 NaN 值的样本方差 (自 RedisTimeSeries v1.8 起)
- 生成的时序数据名称格式为
<label>=<value> - 生成的时序数据包含两个具有以下标签数组结构的标签
__reducer__,使用的归约器 (例如,"count")__source__,用于计算分组系列的时间序列键列表 (例如,"key1,key2,key3")
MRANGE 命令不能作为事务的一部分。
返回值
如果未指定 GROUPBY label REDUCE reducer
- 数组回复:对于每个匹配指定过滤器的时间序列,报告以下内容
如果指定了 GROUPBY label REDUCE reducer
- 数组回复:对于匹配指定过滤器的每个时间序列组,报告以下内容
- 批量字符串回复,格式为
label=value,其中label是GROUPBY的标签参数 - 数组回复:标签-值对 (批量字符串回复, 批量字符串回复)
- 默认情况下,报告一个空数组
- 如果指定了
WITHLABELS,则报告GROUPBY的标签参数和值 - 如果指定了
SELECTED_LABELS label...,则报告选定的标签(如果未定义此类标签或该标签在所有分组的时间序列中值不同,则为 null 值)
- 数组回复:或者单个对 (批量字符串回复, 批量字符串回复):
GROUPBY的标签参数和值,或者空数组,如果 - 数组回复:单个对 (批量字符串回复, 批量字符串回复):字符串
__reducer__和归约器参数 - 数组回复:单个对 (批量字符串回复, 批量字符串回复):字符串
__source__和时间序列键名,以,分隔 - 数组回复:时间戳-值对 (整数回复, 简单字符串回复 (double)):所有匹配范围的样本/聚合结果
- 批量字符串回复,格式为
示例
按时间戳检索最高股票价格
创建两支股票并在三个不同时间戳添加其价格。
127.0.0.1:6379> TS.CREATE stock:A LABELS type stock name A
OK
127.0.0.1:6379> TS.CREATE stock:B LABELS type stock name B
OK
127.0.0.1:6379> TS.MADD stock:A 1000 100 stock:A 1010 110 stock:A 1020 120
1) (integer) 1000
2) (integer) 1010
3) (integer) 1020
127.0.0.1:6379> TS.MADD stock:B 1000 120 stock:B 1010 110 stock:B 1020 100
1) (integer) 1000
2) (integer) 1010
3) (integer) 1020您现在可以按时间戳检索最高股票价格。
127.0.0.1:6379> TS.MRANGE - + WITHLABELS FILTER type=stock GROUPBY type REDUCE max
1) 1) "type=stock"
2) 1) 1) "type"
2) "stock"
2) 1) "__reducer__"
2) "max"
3) 1) "__source__"
2) "stock:A,stock:B"
3) 1) 1) (integer) 1000
2) 120
2) 1) (integer) 1010
2) 110
3) 1) (integer) 1020
2) 120FILTER type=stock 子句返回一个表示股票价格的单个时间序列。GROUPBY type REDUCE max 子句将时间序列拆分为具有相同类型值的组,然后对于每个时间戳,使用 max 聚合器聚合所有共享相同类型值的系列。
计算平均股票价格并检索最高平均值
创建两支股票并在九个不同时间戳添加其价格。
127.0.0.1:6379> TS.CREATE stock:A LABELS type stock name A
OK
127.0.0.1:6379> TS.CREATE stock:B LABELS type stock name B
OK
127.0.0.1:6379> TS.MADD stock:A 1000 100 stock:A 1010 110 stock:A 1020 120
1) (integer) 1000
2) (integer) 1010
3) (integer) 1020
127.0.0.1:6379> TS.MADD stock:B 1000 120 stock:B 1010 110 stock:B 1020 100
1) (integer) 1000
2) (integer) 1010
3) (integer) 1020
127.0.0.1:6379> TS.MADD stock:A 2000 200 stock:A 2010 210 stock:A 2020 220
1) (integer) 2000
2) (integer) 2010
3) (integer) 2020
127.0.0.1:6379> TS.MADD stock:B 2000 220 stock:B 2010 210 stock:B 2020 200
1) (integer) 2000
2) (integer) 2010
3) (integer) 2020
127.0.0.1:6379> TS.MADD stock:A 3000 300 stock:A 3010 310 stock:A 3020 320
1) (integer) 3000
2) (integer) 3010
3) (integer) 3020
127.0.0.1:6379> TS.MADD stock:B 3000 320 stock:B 3010 310 stock:B 3020 300
1) (integer) 3000
2) (integer) 3010
3) (integer) 3020现在,对于每支股票,计算每 1000 毫秒时间范围内的平均股票价格,然后检索在该时间范围内平均值最高的股票。
127.0.0.1:6379> TS.MRANGE - + WITHLABELS AGGREGATION avg 1000 FILTER type=stock GROUPBY type REDUCE max
1) 1) "type=stock"
2) 1) 1) "type"
2) "stock"
2) 1) "__reducer__"
2) "max"
3) 1) "__source__"
2) "stock:A,stock:B"
3) 1) 1) (integer) 1000
2) 110
2) 1) (integer) 2000
2) 210
3) 1) (integer) 3000
2) 310分组查询结果
查询所有 metric 标签等于 cpu 的时间序列,然后按其 metric_name 标签值进行分组,并为每个组返回最大值以及具有该值的时间序列键(源)。
127.0.0.1:6379> TS.ADD ts1 1548149180000 90 labels metric cpu metric_name system
(integer) 1548149180000
127.0.0.1:6379> TS.ADD ts1 1548149185000 45
(integer) 1548149185000
127.0.0.1:6379> TS.ADD ts2 1548149180000 99 labels metric cpu metric_name user
(integer) 1548149180000
127.0.0.1:6379> TS.MRANGE - + WITHLABELS FILTER metric=cpu GROUPBY metric_name REDUCE max
1) 1) "metric_name=system"
2) 1) 1) "metric_name"
2) "system"
2) 1) "__reducer__"
2) "max"
3) 1) "__source__"
2) "ts1"
3) 1) 1) (integer) 1548149180000
2) 90
2) 1) (integer) 1548149185000
2) 45
2) 1) "metric_name=user"
2) 1) 1) "metric_name"
2) "user"
2) 1) "__reducer__"
2) "max"
3) 1) "__source__"
2) "ts2"
3) 1) 1) (integer) 1548149180000
2) 99按值过滤查询
查询所有 metric 标签等于 cpu 的时间序列,然后过滤大于或等于 90.0 且小于或等于 100.0 的值。
127.0.0.1:6379> TS.ADD ts1 1548149180000 90 labels metric cpu metric_name system
(integer) 1548149180000
127.0.0.1:6379> TS.ADD ts1 1548149185000 45
(integer) 1548149185000
127.0.0.1:6379> TS.ADD ts2 1548149180000 99 labels metric cpu metric_name user
(integer) 1548149180000
127.0.0.1:6379> TS.MRANGE - + FILTER_BY_VALUE 90 100 WITHLABELS FILTER metric=cpu
1) 1) "ts1"
2) 1) 1) "metric"
2) "cpu"
2) 1) "metric_name"
2) "system"
3) 1) 1) (integer) 1548149180000
2) 90
2) 1) "ts2"
2) 1) 1) "metric"
2) "cpu"
2) 1) "metric_name"
2) "user"
3) 1) 1) (integer) 1548149180000
2) 99使用标签查询
查询所有 metric 标签等于 cpu 的时间序列,但只返回 team 标签。
127.0.0.1:6379> TS.ADD ts1 1548149180000 90 labels metric cpu metric_name system team NY
(integer) 1548149180000
127.0.0.1:6379> TS.ADD ts1 1548149185000 45
(integer) 1548149185000
127.0.0.1:6379> TS.ADD ts2 1548149180000 99 labels metric cpu metric_name user team SF
(integer) 1548149180000
127.0.0.1:6379> TS.MRANGE - + SELECTED_LABELS team FILTER metric=cpu
1) 1) "ts1"
2) 1) 1) "team"
2) "NY"
3) 1) 1) (integer) 1548149180000
2) 90
2) 1) (integer) 1548149185000
2) 45
2) 1) "ts2"
2) 1) 1) "team"
2) "SF"
3) 1) 1) (integer) 1548149180000
2) 99另请参阅
TS.RANGE | TS.MREVRANGE | TS.REVRANGE