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 Stack / 时间序列 1.0.0
- 时间复杂度
- O(n/m+k),其中 n = 数据点数量,m = 块大小(每个块的数据点数量),k = 请求范围内的数据点数量
根据过滤器向前查询多个时间序列的范围
必需参数
fromTimestamp
是范围查询的起始时间戳(以毫秒为单位的整数 Unix 时间戳)或 -
,表示通过 FILTER filterExpr...
的所有时间序列中最早样本的时间戳。
toTimestamp
是范围查询的结束时间戳(以毫秒为单位的整数 Unix 时间戳)或 +
,表示通过 FILTER filterExpr...
的所有时间序列中最晚样本的时间戳。
FILTER filterExpr...
根据时间序列的标签和标签值过滤时间序列。每个过滤表达式都具有以下语法之一
label!=
- 时间序列具有名为label
的标签label=value
- 时间序列具有名为label
的标签,其值为value
label=(value1,value2,...)
- 时间序列具有名为label
的标签,其值为列表中的一个值label=
- 时间序列没有名为label
的标签label!=value
- 时间序列没有名为label
的标签,其值为value
label!=(value1,value2,...)
- 时间序列没有名为label
的标签,其值为列表中的任何值
- 至少需要一个具有
label=value
或label=(value1,value2,...)
语法的过滤表达式。 - 过滤表达式是合取的。例如,过滤器
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 聚合器 bucketDuration
每个时间序列,将样本聚合到时间桶中,其中
-
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 起)
是一个标志,如果指定,则还将报告空桶的聚合结果。
聚合器 |
为每个空桶报告的值 |
---|---|
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__
,使用的 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__
和 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) 120
FILTER 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
对查询结果进行分组
查询所有度量标签等于 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
按值过滤查询
查询所有度量标签等于 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
使用标签查询
查询所有度量标签等于 cpu
的时间序列,但只返回团队标签。
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