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 = 请求范围内的数据点数

通过正向筛选条件跨多个时间序列查询范围

例子

必需参数

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 起)

当时间序列为 compaction 时使用。跟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

在 reply 中包括表示时间序列元数据标签的所有标签-值对。 如果WITHLABELSSELECTED_LABELS,则默认情况下,空列表将报告为标签值对。

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

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

COUNT count

在没有AGGREGATION:限制每个时间序列报告的样本数。

当与AGGREGATION:限制上报的 Bucket 数量。

ALIGN align(自 RedisTimeSeries v1.6 起)

是 的时间桶对齐控件AGGREGATION.它通过更改定义存储桶的引用时间戳来控制时间存储桶时间戳。

值包括:

  • start或:引用时间戳将是查询开始间隔时间 (-fromTimestamp),而-
  • end或 :引用时间戳将是查询结束间隔时间 (+toTimestamp),而+
  • 特定时间戳:将引用时间戳与特定时间对齐

注意:如果未提供,则 alignment 设置为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,存储桶启动时间是bucketDurationwith restder (余数)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 起)

将时间序列拆分为多个组,每个组都包含共享相同标签名称值的时间序列,然后聚合每个组中的结果。

当与AGGREGATIONGROUPBY/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")

注意:MRANGE命令不能成为事务的一部分。

返回值

如果GROUPBY label REDUCE reducer未指定:

  • Array reply:对于每个匹配指定筛选条件的时间序列,将报告以下内容:

如果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

You can now retrieve the maximum stock price per timestamp.

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

The FILTER type=stock clause returns a single time series representing stock prices. The GROUPBY type REDUCE max clause splits the time series into groups with identical type values, and then, for each timestamp, aggregates all series that share the same type value using the max aggregator.

Calculate average stock price and retrieve maximum average

Create two stocks and add their prices at nine different timestamps.

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

Now, for each stock, calculate the average stock price per a 1000-millisecond timeframe, and then retrieve the stock with the maximum average for that timeframe.

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

Query all time series with the metric label equal to cpu, then group the time series by the value of their metric_name label value and for each group return the maximum value and the time series keys (source) with that value.

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

Query all time series with the metric label equal to cpu, then filter values larger or equal to 90.0 and smaller or equal to 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

Query all time series with the metric label equal to cpu, but only return the team label.

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

See also

TS.RANGE | TS.MREVRANGE | TS.REVRANGE

RedisTimeSeries


RATE THIS PAGE
Back to top ↑