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) 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.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