TS.MRANGE

Syntax
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]
Available in:
Redis Stack / TimeSeries 1.0.0
Time complexity:
O(n/m+k) where n = Number of data points, m = Chunk size (data points per chunk), k = Number of data points that are in the requested ranges

通过过滤器向前查询多个时间序列的范围

示例

必需的参数

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 (since RedisTimeSeries v1.8)

当时间序列是压缩时使用。使用LATEST时,TS.MRANGE还会报告最新(可能是部分)桶的压缩值,前提是该桶的开始时间在[fromTimestamp, toTimestamp]范围内。如果没有LATEST,TS.MRANGE不会报告最新(可能是部分)桶。当时间序列不是压缩时,LATEST会被忽略。

最新压缩桶中的数据可能是部分的。只有在接收到新样本并打开一个新的最新桶时,桶才会被关闭并进行压缩。然而,在某些情况下,也需要最新(可能是部分的)桶的压缩值。在这种情况下,请使用LATEST

FILTER_BY_TS ts... (since RedisTimeSeries v1.6)

通过特定时间戳列表过滤样本。如果样本的确切时间戳被指定并且落在[fromTimestamp, toTimestamp]范围内,则样本通过过滤器。

当与AGGREGATION一起使用时:样本在聚合之前被过滤。

FILTER_BY_VALUE min max (since RedisTimeSeries v1.6)

通过最小值和最大值过滤样本。

当与AGGREGATION一起使用时:样本在聚合之前被过滤。

WITHLABELS

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

SELECTED_LABELS label... (since RedisTimeSeries v1.6)

返回表示时间序列元数据标签的标签-值对的子集。 当每个序列存在大量标签,但只需要某些标签的值时使用。 如果未指定WITHLABELSSELECTED_LABELS,默认情况下,将报告一个空列表作为标签-值对。

COUNT count

当不使用AGGREGATION时:限制每个时间序列报告的样本数量。

当与AGGREGATION一起使用时:限制报告的桶的数量。

ALIGN align (since 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] (since RedisTimeSeries v1.8)

控制如何报告存储桶时间戳。

bt 每个桶报告的时间戳
-start 桶的开始时间(默认)
+end 桶的结束时间
~mid 桶的中间时间(如果不是整数则向下取整)
[EMPTY] (since 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 (since 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 起)

备注:

  • 生成的时间序列被命名为
  • 生成的时间序列包含两个标签,这些标签的数组结构如下:
    • __reducer__,使用的归约器(例如,"count"
    • __source__,用于计算分组序列的时间序列键列表(例如,"key1,key2,key3"

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

返回值

如果未指定GROUPBY label REDUCE reducer

  • Array reply: 对于每个匹配指定过滤器的时间序列,报告以下内容:
    • bulk-string-reply: 时间序列键名
    • Array reply: 标签-值对 (Bulk string reply, Bulk string reply)
      • 默认情况下,报告一个空数组
      • 如果指定了WITHLABELS,则报告与此时间序列关联的所有标签
      • 如果指定了SELECTED_LABELS label...,则报告选定的标签(未定义此类标签时为null值)
    • Array reply: 时间戳-值对 (Integer reply, Simple string reply (double)): 所有匹配范围的样本/聚合

如果指定了GROUPBY label REDUCE reducer

示例

Retrieve maximum stock price per timestamp

创建两只股票并在三个不同的时间戳添加它们的价格。

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 聚合器对所有具有相同类型值的序列进行聚合。

Calculate average stock price and retrieve maximum average

创建两只股票并在九个不同的时间戳添加它们的价格。

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
Group query results

查询所有度量标签等于cpu的时间序列,然后按它们的metric_name标签值对时间序列进行分组,并为每个组返回最大值和具有该值的时间序列键(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.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
Filter query by value

查询所有时间序列,其中度量标签等于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
Query using a label

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