TS.RANGE

语法
TS.RANGE key fromTimestamp toTimestamp
  [LATEST]
  [FILTER_BY_TS ts...]
  [FILTER_BY_VALUE min max]
  [COUNT count] 
  [[ALIGN align] AGGREGATION aggregator bucketDuration [BUCKETTIMESTAMP bt] [EMPTY]]
可用在
Redis Stack / 时间序列 1.0.0
时间复杂度
O(n/m+k) 其中 n = 数据点数量,m = 块大小(每个块的数据点数量),k = 请求范围内的数据点数量

以正向方向查询范围

示例

必需参数

是时间序列的键名。

fromTimestamp

是范围查询的开始时间戳(以毫秒为单位的整数 Unix 时间戳)或 - 表示时间序列中最早样本的时间戳。

toTimestamp

是范围查询的结束时间戳(以毫秒为单位的整数 Unix 时间戳)或 + 表示时间序列中最新样本的时间戳。

注意: 当时间序列是压缩时,最后一个压缩值可能会聚合时间戳超出 toTimestamp 的原始值。这是因为 toTimestamp 仅限制压缩值的时间戳,而压缩值是进行压缩的原始块的开始时间。

可选参数

LATEST (自 RedisTimeSeries v1.8 起)

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

压缩最新块中的数据可能是部分的。只有当新的样本到达并打开一个新的“最新”块时,该块才会被“关闭”并压缩。但是,在某些情况下,可能还需要最新(可能是部分)块的压缩值。在这种情况下,请使用 LATEST

FILTER_BY_TS ts... (自 RedisTimeSeries v1.6 起)

根据特定时间戳列表过滤样本。如果样本的精确时间戳已指定并且落在 [fromTimestamp, toTimestamp] 内,则该样本将通过过滤器。

AGGREGATION 结合使用时:在进行聚合之前先过滤样本。

FILTER_BY_VALUE min max (自 RedisTimeSeries v1.6 起)

根据最小值和最大值过滤样本。

AGGREGATION 结合使用时:在进行聚合之前先过滤样本。

COUNT 计数

在不使用 AGGREGATION 的情况下使用时:限制报告的样本数量。

AGGREGATION 结合使用时:限制报告的块数量。

ALIGN 对齐 (自 RedisTimeSeries v1.6 起)

AGGREGATION 的时间块对齐控制。它通过更改定义块的参考时间戳来控制时间块时间戳。

align 值包括

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

是一个标志,当指定时,也会报告空桶的聚合。

聚合器 每个空桶报告的值
sum, count 0
last 桶开始之前最后一个样本的值。如果不存在此类样本,则为 NaN
twa 基于桶开始之前最后一个样本和桶结束之后第一个样本的线性插值的桶时间范围内的平均值。如果不存在此类样本,则为 NaN
min, max, range, avg, first, std.p, std.s NaN

无论 fromTimestamptoTimestamp 的值如何,都不会报告时间序列中最早样本之前结束或最晚样本之后开始的桶的数据。

返回值

返回以下回复之一

复杂度

将来可以使用二分查找来查找范围的开始,从而提高 TS.RANGE 的复杂度,这使得它为 O(Log(n/m)+k*m)。但是,因为 m 很小,所以可以忽略它,并将操作视为 O(Log(n)+k)

示例

按时间戳或样本值过滤结果

考虑一个指标,其中可接受的值在 -100 到 100 之间,值 9999 用作不良测量值的指示。

127.0.0.1:6379> TS.CREATE temp:TLV LABELS type temp location TLV
OK
127.0.0.1:6379> TS.MADD temp:TLV 1000 30 temp:TLV 1010 35 temp:TLV 1020 9999 temp:TLV 1030 40
1) (integer) 1000
2) (integer) 1010
3) (integer) 1020
4) (integer) 1030

现在,检索所有值,除了超出范围的值。

TS.RANGE temp:TLV - + FILTER_BY_VALUE -100 100
1) 1) (integer) 1000
   2) 30
2) 1) (integer) 1010
   2) 35
3) 1) (integer) 1030
   2) 40

现在,检索平均值,同时忽略超出范围的值。

TS.RANGE temp:TLV - + FILTER_BY_VALUE -100 100 AGGREGATION avg 1000
1) 1) (integer) 1000
   2) 35
对齐聚合桶

为了演示对齐,让我们创建一个股票并在九个不同的时间戳添加价格。

127.0.0.1:6379> TS.CREATE stock:A LABELS type stock name A
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: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:A 3000 300 stock:A 3010 310 stock:A 3020 320
1) (integer) 3000
2) (integer) 3010
3) (integer) 3020

接下来,在不使用 ALIGN 的情况下进行聚合,默认对齐为 0。

127.0.0.1:6379> TS.RANGE stock:A - + AGGREGATION min 20
1) 1) (integer) 1000
   2) 100
2) 1) (integer) 1020
   2) 120
3) 1) (integer) 1040
   2) 210
4) 1) (integer) 1060
   2) 300
5) 1) (integer) 1080
   2) 320

现在将 ALIGN 设置为 10,以便在时间 10 处有一个桶开始,并将所有桶与 20 毫秒的持续时间对齐。

127.0.0.1:6379> TS.RANGE stock:A - + ALIGN 10 AGGREGATION min 20
1) 1) (integer) 990
   2) 100
2) 1) (integer) 1010
   2) 110
3) 1) (integer) 1990
   2) 200
4) 1) (integer) 2010
   2) 210
5) 1) (integer) 2990
   2) 300
6) 1) (integer) 3010
   2) 310

当显式声明范围查询的开始时间戳(不是 -)时,可以通过将 align 设置为 -start 来将 ALIGN 设置为该时间。

127.0.0.1:6379> TS.RANGE stock:A 5 + ALIGN - AGGREGATION min 20
1) 1) (integer) 985
   2) 100
2) 1) (integer) 1005
   2) 110
3) 1) (integer) 1985
   2) 200
4) 1) (integer) 2005
   2) 210
5) 1) (integer) 2985
   2) 300
6) 1) (integer) 3005
   2) 310

类似地,当显式声明范围查询的结束时间戳时,可以通过将 align 设置为 +end 来将 ALIGN 设置为该时间。

另请参阅

TS.MRANGE | TS.REVRANGE | TS.MREVRANGE

RedisTimeSeries


RATE THIS PAGE
Back to top ↑