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]
- Available in:
- Redis Stack / TimeSeries 1.0.0
- Time complexity:
- O(n/m+k) where n = Number of data points, m = Chunk size (data points per chunk), k = Number of data points that are in the requested ranges
通过过滤器向前查询多个时间序列的范围
必需的参数
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
(since RedisTimeSeries v1.8)
当时间序列是压缩时使用。使用LATEST
时,TS.MRANGE还会报告最新(可能是部分)桶的压缩值,前提是该桶的开始时间在[fromTimestamp, toTimestamp]
范围内。如果没有LATEST
,TS.MRANGE不会报告最新(可能是部分)桶。当时间序列不是压缩时,LATEST
会被忽略。
最新压缩桶中的数据可能是部分的。只有在接收到新样本并打开一个新的最新桶时,桶才会被关闭并进行压缩。然而,在某些情况下,也需要最新(可能是部分的)桶的压缩值。在这种情况下,请使用LATEST
。
FILTER_BY_TS ts...
(since RedisTimeSeries v1.6)
通过特定时间戳列表过滤样本。如果样本的确切时间戳被指定并且落在[fromTimestamp, toTimestamp]
范围内,则样本通过过滤器。
当与AGGREGATION
一起使用时:样本在聚合之前被过滤。
FILTER_BY_VALUE min max
(since RedisTimeSeries v1.6)
通过最小值和最大值过滤样本。
当与AGGREGATION
一起使用时:样本在聚合之前被过滤。
WITHLABELS
在回复中包含所有表示时间序列元数据标签的标签-值对。
如果未指定WITHLABELS
或SELECTED_LABELS
,默认情况下,将报告一个空列表作为标签-值对。
SELECTED_LABELS label...
(since RedisTimeSeries v1.6)
返回表示时间序列元数据标签的标签-值对的子集。
当每个序列存在大量标签,但只需要某些标签的值时使用。
如果未指定WITHLABELS
或SELECTED_LABELS
,默认情况下,将报告一个空列表作为标签-值对。
COUNT count
当不使用AGGREGATION
时:限制每个时间序列报告的样本数量。
当与AGGREGATION
一起使用时:限制报告的桶的数量。
ALIGN align
(since 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]
(since RedisTimeSeries v1.8)
控制如何报告存储桶时间戳。
bt |
每个桶报告的时间戳 |
---|---|
- 或 start |
桶的开始时间(默认) |
+ 或 end |
桶的结束时间 |
~ 或 mid |
桶的中间时间(如果不是整数则向下取整) |
[EMPTY]
(since 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
(since 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 起)
- 生成的时间序列被命名为
- 生成的时间序列包含两个标签,这些标签的数组结构如下:
__reducer__
,使用的归约器(例如,"count"
)__source__
,用于计算分组序列的时间序列键列表(例如,"key1,key2,key3"
)
MRANGE
命令不能作为事务的一部分。
返回值
如果未指定GROUPBY label REDUCE reducer
:
- Array reply: 对于每个匹配指定过滤器的时间序列,报告以下内容:
- bulk-string-reply: 时间序列键名
- Array reply: 标签-值对 (Bulk string reply, Bulk string reply)
- 默认情况下,报告一个空数组
- 如果指定了
WITHLABELS
,则报告与此时间序列关联的所有标签 - 如果指定了
SELECTED_LABELS label...
,则报告选定的标签(未定义此类标签时为null值)
- Array reply: 时间戳-值对 (Integer reply, Simple string reply (double)): 所有匹配范围的样本/聚合
如果指定了GROUPBY label REDUCE reducer
:
- Array reply: 对于每个匹配指定过滤器的时间序列组,报告以下内容:
- 格式为
label=value
的bulk-string-reply,其中label
是GROUPBY
标签参数 - Array reply: 标签-值对(Bulk string reply, Bulk string reply):
- 默认情况下,报告一个空数组
- 如果指定了
WITHLABELS
,则报告GROUPBY
标签参数和值 - 如果指定了
SELECTED_LABELS label...
,则报告选定的标签(当没有定义此类标签或标签对于所有分组时间序列不具有相同值时,值为null)
- Array reply: 单个对(Bulk string reply, Bulk string reply):
GROUPBY
标签参数和值,或者如果为空数组 - Array reply: 单个对(Bulk string reply, Bulk string reply):字符串
__reducer__
和reducer参数 - Array reply: 单个对(Bulk string reply, Bulk string reply):字符串
__source__
和时间序列键名,由,
分隔 - Array reply: 时间戳-值对(Integer reply, Simple string reply (double)):所有匹配范围的样本/聚合
- 格式为
示例
Retrieve maximum stock price per timestamp
创建两只股票并在三个不同的时间戳添加它们的价格。
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 聚合器对所有具有相同类型值的序列进行聚合。
Calculate average stock price and retrieve maximum average
创建两只股票并在九个不同的时间戳添加它们的价格。
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
Group query results
查询所有度量标签等于cpu
的时间序列,然后按它们的metric_name
标签值对时间序列进行分组,并为每个组返回最大值和具有该值的时间序列键(source)。
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
Filter query by value
查询所有时间序列,其中度量标签等于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
Query using a label
查询所有度量标签等于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