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 Stack / 时间序列 1.0.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.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 聚合器 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 起)

是一个标志,如果指定,则还将报告空桶的聚合结果。

聚合器 为每个空桶报告的值
sumcount 0
last 桶开始时间之前的最后一个样本的值。当没有这样的样本时为 NaN
twa 基于桶开始时间之前的最后一个样本和桶结束时间之后第一个样本的线性插值,在桶时间范围内的平均值。当没有这样的样本时为 NaN
minmaxrangeavgfirststd.pstd.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 集群上运行时,MRANGE 命令不能是事务的一部分。

返回值

如果未指定 GROUPBY label REDUCE reducer

  • 数组回复:对于每个匹配指定过滤器的時間序列,以下将被报告
    • 块字符串回复:时间序列键名称
    • 数组回复:标签-值对 (块字符串回复块字符串回复)
      • 默认情况下,将报告一个空数组
      • 如果指定了 WITHLABELS,则将报告与该时间序列相关联的所有标签
      • 如果指定了 SELECTED_LABELS label...,则将报告选定的标签(如果未定义该标签,则值为 null)
    • 数组回复:时间戳-值对 (整数回复简单字符串回复 (double)):所有匹配范围的样本/聚合

如果指定了 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
对查询结果进行分组

查询所有度量标签等于 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
按值过滤查询

查询所有度量标签等于 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
使用标签查询

查询所有度量标签等于 cpu 的时间序列,但只返回团队标签。

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


RATE THIS PAGE
Back to top ↑