TS.RANGE

正向查询范围

语法

TS.RANGE key fromTimestamp toTimestamp [LATEST] [FILTER BY TS Timestamp [Timestamp ...]] [FILTER BY VALUE min max] [COUNT count] [[ALIGN value] AGGREGATION aggregators bucketDuration [BUCKETTIMESTAMP] [EMPTY]]

引入版本:1.0.0

复杂度摘要:O(n/m+k)

正向查询范围。从 Redis 8.6 开始,NaN 值包含在原始测量报告(不进行聚合的查询)中。

示例

必需参数

key

是时间序列的键名称。

fromTimestamp

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

toTimestamp

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

Note: When the time series is a compaction, the last compacted value may aggregate raw values with timestamp beyond toTimestamp. That is because toTimestamp only limits the timestamp of the compacted value, which is the start time of the raw bucket that was compacted.

可选参数

LATEST(自 RedisTimeSeries 1.8 起)

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

压缩的最新桶中的数据可能是部分的。存储桶是 关闭,并且仅在新样本到达时才进行压缩,该新样本将 打开 变为新的 最新的 存储桶。然而,在某些情况下,还需要最新的(可能是部分的)存储桶的压缩值。在这种情况下,请使用 LATEST。

FILTER_BY_TS ts...(自 RedisTimeSeries 1.6 起)

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

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

FILTER_BY_VALUE min max(自 RedisTimeSeries 1.6 起)

按最小值和最大值过滤样本。 min 和 max 不能是 NaN 值。

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

COUNT count

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

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

ALIGN align(自 RedisTimeSeries 1.6 起)

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

align 值包括:

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

Note: When not provided, alignment is set to 0.

AGGREGATION aggregators bucketDuration

对于每个时间序列,将样本聚合到时间桶中,其中:

  • aggregators 是下表中的一个或多个以逗号分隔的聚合器:

    聚合器 说明
    avg 所有非 NaN 值的算术平均值
    sum 所有非 NaN 值的总和
    min 最小非 NaN 值
    max 最大非 NaN 值
    range 最大和最小非 NaN 值之间的差异
    count 非 NaN 值的数量
    countNaN NaN 值的数量(自 Redis 8.6 起)
    countAll 值的数量,包括 NaN 和非 NaN(自 Redis 8.6 起)
    first 桶中时间戳最小的非NaN值
    last 桶中时间戳最大的非NaN值
    std.p 非 NaN 值的总体标准差
    std.s 非 NaN 值的样本标准差
    var.p 非 NaN 值的总体方差
    var.s 非 NaN 值的样本方差
    twa 存储桶时间范围内的时间加权平均值(忽略 NaN 值)(自 RedisTimeSeries 1.8 起)
  • bucketDuration 是每个桶的持续时间,单位为毫秒。

注意:aggregators 可以是单个聚合器,也可以是用逗号分隔的多个聚合器,如下所示。聚合器之间不允许有空格。

聚合最小值、平均值、最大值

如果没有 ALIGN,存储桶开始时间是 bucketDuration 的倍数。

对于 ALIGN align,存储桶开始时间是 bucketDuration 的倍数,余数是 align % bucketDuration。

第一个桶开始时间小于或等于fromTimestamp。

[BUCKETTIMESTAMP bt](自 RedisTimeSeries 1.8 起)

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

bt 为每个存储桶报告时间戳
- or start Bucket的开始时间(默认)
+ or end 桶的结束时间
~ or mid 桶的中间时间(如果不是整数则向下舍入)
[EMPTY](自 RedisTimeSeries 1.8 起)

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

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

无论 fromTimestamp 和 toTimestamp 的值如何,对于时间序列中最早样本之前结束或最新样本之后开始的存储桶,不会报告任何数据。

复杂性

TS.RANGE 的复杂度可以在未来通过使用二分搜索来找到范围的开始来提高,这使得这个 O(Log(n/m)+k*m)。 But, because m is small, you can disregard it and look at the operation as O(Log(n)+k).

示例

Filter results by timestamp or sample value

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

127.0.0.1:6379> TS.CREATE temp:TLV LABELS 类型临时位置 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) (整数)1000 2)(整数)1010 3)(整数)1020 4)(整数)1030

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

TS.RANGE 温度:TLV - + FILTER_BY_VALUE -100 100 1) 1)(整数)1000 2) 30 2) 1)(整数)1010 2) 35 3) 1)(整数)1030 2) 40

现在,检索最小值、平均值和最大值,同时忽略超出范围的值。

TS.RANGE 温度:TLV - + FILTER_BY_VALUE -100 100 聚合最小值、平均值、最大值 1000 1) 1) (整数) 1000 2) 30 3) 35 4) 40

Align aggregation buckets

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

127.0.0.1:6379> TS.CREATE 库存:A LABELS 类型库存名称 A OK 127.0.0.1:6379> TS.MADD 库存:A 1000 100 库存:A 1010 110 库存:A 1020 120 1) (整数) 1000 2) (整数) 1010 3) (整数) 1020 127.0.0.1:6379> TS.MADD 股票:A 2000 200 股票:A 2010 210 股票:A 2020 220 1) (整数) 2000 2) (整数) 2010 3) (整数) 2020 127.0.0.1:6379> TS.MADD 库存:A 3000 300 库存:A 3010 310 库存:A 3020 320 1) (整数) 3000 2) (整数) 3010 3) (整数) 3020

接下来,不使用ALIGN进行聚合,默认对齐0。

127.0.0.1:6379> TS.RANGE 库存:A - + 聚合 分钟 20 1) 1) (整数) 1000 2) 100 2) 1) (整数) 1020 2) 120 3) 1) (整数) 2000 2) 200 4) 1) (整数) 2020 2) 220 5) 1) (整数) 3000 2) 300 6) 1) (整数) 3020 2) 320

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

127.0.0.1:6379> TS.RANGE 库存:A - + ALIGN 10 聚合 分钟 20 1) 1) (整数) 990 2) 100 2) 1) (整数) 1010 2) 110 3) 1) (整数) 1990 2) 200 4) 1) (整数) 2010 2) 210 5) 1) (整数) 2990 2) 300 6) 1) (整数) 3010 2) 310

当明确指定范围查询的开始时间戳(不是 -)时,您可以通过将align 设置为- 或start 将ALIGN 设置为该时间。

127.0.0.1:6379> TS.RANGE 库存:A 5 + 对齐 - 聚合 分钟 20 1) 1) (整数) 985 2) 100 2) 1) (整数) 1005 2) 110 3) 1) (整数) 1985 2) 200 4) 1) (整数) 2005 2) 210 5) 1) (整数) 2985 2) 300 6) 1) (整数) 3005 2) 310

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

Redis Software 与 Redis Cloud 兼容性

Redis
软件
Redis
Cloud
说明
✅ 支持
✅ 灵活且每年一次
✅ 免费和固定

返回值

RESP2

以下之一: * 数组回复 of * 不带 AGGREGATION 或使用单个聚合器:(整数回复、简单字符串回复)对表示(时间戳、值)。 * 使用多个聚合器:(整数回复,多个简单字符串回复)元组表示(时间戳,值...)。 * 简单错误回复 在这些情况下:无效的过滤值、错误的键类型、键不存在等。

RESP3

以下之一: * 数组回复 of * 不带 AGGREGATION 或使用单个聚合器:(整数回复、双重回复)对表示(时间戳、值)。 * 使用多个聚合器:(整数回复,多个双重回复)元组表示(时间戳,值...)。
* 简单错误回复 在这些情况下:无效的过滤器值、错误的键类型、键不存在等。

参见

TS.MRANGE | TS.REVRANGE | TS.MREVRANGE

Redis时间系列

资料来源:Redis 官方 TS.RANGE 文档;中文内容参考 Redis 文档许可。