TS.MRANGE

语法
TS.MRANGE 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.0.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=valuelabel=(value1,value2,...) 的过滤表达式。
  • 过滤表达式是合取(AND)关系。例如,过滤器 type=temperature room=study 表示时间序列是书房的温度时间序列。
  • 过滤表达式中不允许使用空格,除非在值中使用引号或双引号括起来 - 例如,x="y y"x='(y y,z z)'

可选参数

LATEST (自 RedisTimeSeries v1.8 起)

用于时间序列是压缩时。使用 LATEST,TS.MRANGE 还会报告最新(可能不完整)桶的压缩值,前提是该桶的开始时间落在 [fromTimestamp, toTimestamp] 范围内。不使用 LATEST 时,TS.MRANGE 不报告最新(可能不完整)桶。当时间序列不是压缩时,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__,使用的归约器 (例如,"count")
    • __source__,用于计算分组系列的时间序列键列表 (例如,"key1,key2,key3")

注意:在 Redis 集群上运行时,MRANGE 命令不能作为事务的一部分。

返回值

如果未指定 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.MRANGE - + 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) 1000
         2) 120
      2) 1) (integer) 1010
         2) 110
      3) 1) (integer) 1020
         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.MRANGE - + 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) 1000
         2) 110
      2) 1) (integer) 2000
         2) 210
      3) 1) (integer) 3000
         2) 310
分组查询结果

查询所有 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.MRANGE - + 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) 1548149180000
         2) 90
      2) 1) (integer) 1548149185000
         2) 45
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.MRANGE - + 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.MRANGE - + SELECTED_LABELS team FILTER metric=cpu
1) 1) "ts1"
   2) 1) 1) "team"
         2) "NY"
   3) 1) 1) (integer) 1548149180000
         2) 90
      2) 1) (integer) 1548149185000
         2) 45
2) 1) "ts2"
   2) 1) 1) "team"
         2) "SF"
   3) 1) 1) (integer) 1548149180000
         2) 99

另请参阅

TS.RANGE | TS.MREVRANGE | TS.REVRANGE

RedisTimeSeries


评价本页
返回顶部 ↑
© . This site is unofficial and not affiliated with Redis, Inc.