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 开源版 / TimeSeries 1.0.0
时间复杂度
O(n/m+k),其中 n = 数据点数量,m = 分块大小(每块的数据点数量),k = 请求范围内的数据点数量
ACL 类别
@timeseries, @read, @slow,

正向查询范围

示例

必选参数

key

时间序列的键名。

fromTimestamp

范围查询的开始时间戳(毫秒级的 Unix 整数时间戳),或使用 - 表示时间序列中最早样本的时间戳。

toTimestamp

范围查询的结束时间戳(毫秒级的 Unix 整数时间戳),或使用 + 表示时间序列中最新样本的时间戳。

注意:当时间序列是压缩(compaction)时,最后一个压缩值可能聚合了时间戳超出 toTimestamp 的原始值。这是因为 toTimestamp 只限制了压缩值的时间戳,而压缩值是原始桶(raw bucket)的起始时间。

可选参数

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 count

不与 AGGREGATION 一起使用时:限制报告的样本数量。

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

ALIGN align(自 RedisTimeSeries v1.6 起可用)

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

align 值包括

  • 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.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


评价此页面
返回顶部 ↑
© . This site is unofficial and not affiliated with Redis, Inc.