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 Stack / TimeSeries 1.4.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.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
采用以下聚合类型之一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__
,使用的 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
子句将时间序列拆分为具有相同 type 值的组,然后,对于每个时间戳,使用 max 聚合器聚合所有具有相同 type 值的序列。
计算平均股票价格并检索最大平均值
创建两只股票,并在九个不同的时间戳添加其价格。
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
分组查询结果
查询所有度量标签等于 cpu
的时间序列,然后按其 metric_name
标签值的 value 对时间序列进行分组,并对于每个组返回最大值和具有该值的时序键(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.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
按值过滤查询
查询所有度量标签等于 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
使用标签进行查询
查询所有度量标签等于 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