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 |
无论 fromTimestamp
和 toTimestamp
的值如何,都不会报告时间序列中最早样本之前结束或最晚样本之后开始的桶的数据。
返回值
返回以下回复之一
复杂度
将来可以使用二分查找来查找范围的开始,从而提高 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