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,

通过过滤器以反向查询多个时间序列中的范围。

注意
仅当当前用户对所有匹配过滤器的键具有读取权限时,此命令才会回复。否则,它将回复“(error): current user doesn't have read permission to one or more keys that match the specified filter”(错误:当前用户对一个或多个匹配指定过滤器的键没有读取权限)。

示例

必需参数

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,...) 的过滤器表达式。
  • 过滤器表达式是合取(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

在回复中包含表示时间序列元数据标签的所有标签-值对。如果未指定 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 是以下聚合类型之一

    聚合器 描述
    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

无论 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 子句将时间序列按相同的类型值分割成组,然后,对于每个时间戳,使用 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

RedisTimeSeries


评价本页
返回顶部 ↑