TS.MREVRANGE
TS.MREVRANGE 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.4.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且值等于value的标签label=(value1,value2,...)- 时间序列具有名为label且值等于列表中任意一个值的标签label=- 时间序列不具有名为label的标签label!=value- 时间序列不具有名为label且值等于value的标签label!=(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.MREVRANGE 还会报告最新(可能不完整)桶的压缩值,前提是该桶的开始时间落在 [fromTimestamp, toTimestamp] 范围内。不使用 LATEST 时,TS.MREVRANGE 不会报告最新(可能不完整)的桶。当时间序列不是压缩数据时,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是以下聚合类型之一聚合器描述 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")
MREVRANGE 命令不能作为事务的一部分。
返回值
如果未指定 GROUPBY label REDUCE reducer
- 数组回复:对于每个匹配指定过滤器的时间序列,报告以下内容
如果指定了 GROUPBY label REDUCE reducer
- 数组回复:对于每个匹配指定过滤器的时间序列组,报告以下内容
示例
按时间戳检索最高股票价格
创建两个股票并在三个不同的时间戳添加其价格。
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.MREVRANGE - + 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) 1020
2) 120
2) 1) (integer) 1010
2) 110
3) 1) (integer) 1000
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.MREVRANGE - + 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) 3000
2) 310
2) 1) (integer) 2000
2) 210
3) 1) (integer) 1000
2) 110分组查询结果
查询所有 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.MREVRANGE - + 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) 1548149185000
2) 45
2) 1) (integer) 1548149180000
2) 90
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.MREVRANGE - + 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.MREVRANGE - + SELECTED_LABELS team FILTER metric=cpu
1) 1) "ts1"
2) 1) 1) "team"
2) (nil)
3) 1) 1) (integer) 1548149185000
2) 45
2) 1) (integer) 1548149180000
2) 90
2) 1) "ts2"
2) 1) 1) "team"
2) (nil)
3) 1) 1) (integer) 1548149180000
2) 99另请参阅
TS.MRANGE | TS.RANGE | TS.REVRANGE