TS.REVRANGE

语法
TS.REVRANGE 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.4.0
时间复杂度
O(n/m+k) 其中 n = 数据点数量,m = 块大小(每个块的数据点数量),k = 请求范围内的数据点数量

以反向查询范围

示例

必填参数

key

是时间序列的键名。

fromTimestamp

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

toTimestamp

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

注意:当时间序列是压缩时,最后一个压缩值可能聚合时间戳超出 toTimestamp 的原始值。这是因为 toTimestamp 仅限制压缩值的 timestamp,它就是被压缩的原始桶的开始时间。

可选参数

LATEST (自 RedisTimeSeries v1.8 起)

当时间序列是压缩时使用。使用 LATEST 时,TS.REVRANGE 还会报告最新的(可能是部分的)桶的压缩值,因为该桶的开始时间位于 [fromTimestamp, toTimestamp] 内。如果没有 LATEST,TS.REVRANGE 不会报告最新的(可能是部分的)桶。当时间序列不是压缩时,LATEST 将被忽略。

压缩的最新桶中的数据可能是部分的。只有在收到新的样本打开新的最新桶后,桶才会关闭并压缩。但是,在某些情况下,也需要报告最新的(可能是部分的)桶的压缩值。在这种情况下,请使用 LATEST

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

按特定时间戳列表过滤样本。如果样本的精确时间戳已指定且位于 [fromTimestamp, toTimestamp] 内,则该样本将通过过滤器。

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

FILTER_BY_VALUE min max (自 RedisTimeSeries v1.6 起)

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

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

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 的值如何,对于在时间序列中最早样本之前结束或在最新样本之后开始的存储桶,都不会报告数据。

返回值

返回以下回复之一

复杂度

将来可以使用二分查找来找到范围的起点,从而提高 TS.REVRANGE 的复杂度,使其变为 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.REVRANGE temp:TLV - + FILTER_BY_VALUE -100 100
1) 1) (integer) 1030
   2) 40
2) 1) (integer) 1010
   2) 35
3) 1) (integer) 1000
   2) 30

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

TS.REVRANGE 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.REVRANGE stock:A - + AGGREGATION min 20
1) 1) (integer) 3020
   2) 320
2) 1) (integer) 3000
   2) 300
3) 1) (integer) 2020
   2) 220
4) 1) (integer) 2000
   2) 200
5) 1) (integer) 1020
   2) 120
6) 1) (integer) 1000
   2) 100

现在将 ALIGN 设置为 10,使存储桶从时间 10 开始,并将所有存储桶的对齐到 20 毫秒的持续时间。

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

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

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

同样,当显式地指定范围查询的结束时间戳时,可以通过将 align 设置为 +end 来将 ALIGN 设置为该时间。

另请参见

TS.RANGE | TS.MRANGE | TS.MREVRANGE

RedisTimeSeries


RATE THIS PAGE
Back to top ↑