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=valuelabel=(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

在回复中包含所有表示时间序列元数据标签的标签-值对。如果没有指定 WITHLABELSSELECTED_LABELS,则默认情况下,将报告一个空列表作为标签-值对。

SELECTED_LABELS label...(自 RedisTimeSeries v1.6 起)

返回表示时间序列元数据标签的标签-值对的子集。当每个序列存在大量标签但只需要某些标签的值时使用。如果没有指定 WITHLABELSSELECTED_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

无论 fromTimestamptoTimestamp 的值如何,对于在时间序列中最早样本之前结束或在最晚样本之后开始的桶,都不会报告数据。

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"

注意:在 Redis 集群上运行时,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

RedisTimeSeries


RATE THIS PAGE
Back to top ↑