TS.NREVRANGE
按时间戳倒序查询多个时间序列。
语法
TS.NREVRANGE numkeys key [key ...] fromTimestamp toTimestamp [LATEST] [FILTER BY TS ts [ts ...]] [FILTER BY VALUE min max] [COUNT count] [[ALIGN align] AGGREGATION aggregators [aggregators ...] bucketDuration [BUCKETTIMESTAMP ] [EMPTY]]
引入版本:8.10.0
复杂度摘要:O(numkeys*(n/m+k)
反向查询时间序列显式列表中的范围。 TS.NREVRANGE 按时间戳对结果进行分组:对于每个时间戳,它返回时间戳,后跟每个时间序列的一个值(按照给定键的顺序)。使用 AGGREGATION,时间序列可以为每个时间戳提供多个值 - 每个聚合器请求一个值。在给定时间戳处没有样本的时间序列将返回该时间戳的 NaN。
[!NOTE] 在 Redis 集群中,所有指定的键必须映射到同一个哈希槽。
TS.NREVRANGE是 单哈希槽 命令;它不会跨分片拆分请求或合并来自多个哈希槽的回复。
必需参数
numkeys
是后面的时间序列键的数量。它必须是正整数并且必须等于 key 参数的数量。
key [key ...]
是要查询的显式时间序列键。键顺序和重复键很重要:输出中每个 key 参数都有一个值,按照给定键的顺序排列。重复的键每次出现都会产生一个单独的值。
fromTimestamp
是范围查询的开始时间戳(以毫秒为单位的整数 Unix 时间戳)或 - 表示指定时间序列中最早样本的时间戳。该范围包括在内。
toTimestamp
是范围查询的结束时间戳(以毫秒为单位的整数 Unix 时间戳)或 + 表示指定时间序列中最新样本的时间戳。该范围包括在内。
可选参数
LATEST
当时间序列是压缩时使用。使用 LATEST,TS.NREVRANGE 还会报告最新(可能是部分)存储桶的压缩值,前提是该存储桶的开始时间落在 [fromTimestamp, toTimestamp] 范围内。如果没有 LATEST,TS.NREVRANGE 不会报告最新的(可能是部分的)存储桶。当时间序列不是压缩时,LATEST 被忽略。
压缩的最新桶中的数据可能是部分的。存储桶是 关闭,并且仅在新样本到达时才进行压缩,该新样本将 打开 变为新的 最新的 存储桶。然而,在某些情况下,还需要最新的(可能是部分的)存储桶的压缩值。在这种情况下,请使用 LATEST。
FILTER_BY_TS ts...
通过特定时间戳列表过滤样本。如果指定了确切的时间戳且落在 [fromTimestamp, toTimestamp] 范围内,则样本将通过过滤器。样本在旋转之前经过过滤。
与 AGGREGATION 一起使用时:样本在聚合之前经过过滤。
FILTER_BY_VALUE min max
按最小值和最大值过滤样本。如果样本的值在 [min, max] 包含范围内,则样本通过过滤器。 min 和 max 不能为 NaN 值。样本在旋转之前经过过滤。
与 AGGREGATION 一起使用时:样本在聚合之前经过过滤。
COUNT count
限制返回条目的数量,保留具有最高时间戳的条目。该限制在按时间戳合并后应用。
ALIGN align
是AGGREGATION的时间桶对齐控制。它通过更改定义桶的参考时间戳来控制时间桶时间戳。
align 值包括:
start或-:参考时间戳将是查询开始间隔时间(fromTimestamp),不能是-end或+:参考时间戳将是查询结束间隔时间(toTimestamp),不能是+- 特定时间戳:将参考时间戳与特定时间对齐
0.
AGGREGATION aggregators [aggregators ...] bucketDuration
将样本聚合到时间桶中。
为每个键提供一个或多个聚合器,作为单独的参数,其顺序与键相同:第一个参数适用于第一个键,依此类推。这些参数的数量必须等于 numkeys,并且所有键共享相同的 bucketDuration。
每个键参数要么是单个聚合器,要么是逗号分隔的聚合器列表(例如 avg,max),与 TS.REVRANGE 完全相同;不允许有空格。一个键为您为其列出的每个聚合器提供一个值,并且键的值按照您列出其聚合器的顺序一起出现在回复中。要计算一个系列的多个聚合,请为该键提供一个以逗号分隔的列表,例如 min,max。
-
每个
aggregator是以下之一:聚合器 说明 avg所有非 NaN 值的算术平均值 sum所有非 NaN 值的总和 min最小非 NaN 值 max最大非 NaN 值 range最大和最小非 NaN 值之间的差异 count非 NaN 值的数量 countNaNNaN 值的数量 countAll值的数量,包括 NaN 和非 NaN first桶中时间戳最小的非NaN值 last桶中时间戳最大的非NaN值 std.p非 NaN 值的总体标准差 std.s非 NaN 值的样本标准差 var.p非 NaN 值的总体方差 var.s非 NaN 值的样本方差 twa存储桶时间范围内的时间加权平均值(忽略 NaN 值) -
bucketDuration是每个桶的持续时间,单位毫秒。
如果没有 ALIGN,存储桶开始时间是 bucketDuration 的倍数。
对于 ALIGN align,存储桶开始时间是 bucketDuration 的倍数,余数是 align % bucketDuration。
第一个桶开始时间小于或等于fromTimestamp。
[BUCKETTIMESTAMP bt]
控制如何报告存储桶时间戳。
bt |
为每个存储桶报告时间戳 |
|---|---|
- or start |
Bucket的开始时间(默认) |
+ or end |
桶的结束时间 |
~ or mid |
桶的中间时间(如果不是整数则向下舍入) |
[EMPTY]
是一个标志,指定后也报告空桶的聚合。
| 聚合器 | 为每个空桶报告的值 |
|---|---|
sum, count |
0 |
last |
存储桶开始之前的最后一个样本的值。 NaN 当没有这样的样本时。 |
twa |
存储桶时间范围内的平均值,基于存储桶开始前的最后一个样本和存储桶结束后的第一个样本的线性插值。 NaN 当没有这样的样本时。 |
min, max, range, avg, first, std.p, std.s |
NaN |
无论 fromTimestamp 和 toTimestamp 的值如何,对于时间序列中最早样本之前结束或最新样本之后开始的存储桶,不会报告任何数据。当报告某个键的存储桶但另一个键在该存储桶中没有数据时,该键的值为 NaN。
示例
Pivot raw samples from multiple series by timestamp
创建两个时间序列并在部分重叠的时间戳处添加样本。
redis> TS.CREATE {sensor}:1
OK
redis> TS.CREATE {sensor}:2
OK
redis> TS.MADD {sensor}:1 1000 10 {sensor}:1 2000 12
1) (integer) 1000
2) (integer) 2000
redis> TS.MADD {sensor}:2 1000 20 {sensor}:2 3000 25
1) (integer) 1000
2) (integer) 3000
查询两个系列并按时间戳对样本进行分组。为至少一个键生成的每个不同时间戳返回一个条目,从最高时间戳到最低时间戳排序,值按输入键排序。在该时间戳处没有样本的键具有 NaN 值。
redis> TS.NREVRANGE 2 {sensor}:1 {sensor}:2 - +
1) 1) (integer) 3000
2) 1) NaN
2) 25
2) 1) (integer) 2000
2) 1) 12
2) NaN
3) 1) (integer) 1000
2) 1) 10
2) 20
Aggregate each series with a per-key aggregator
在聚合模式下,按键顺序为每个键提供一个聚合器。这里,{sensor}:3 与 avg 聚合,{sensor}:4 与 sum 聚合,两者都超过 1000 毫秒的存储桶。
redis> TS.CREATE {sensor}:3
OK
redis> TS.CREATE {sensor}:4
OK
redis> TS.MADD {sensor}:3 1000 10 {sensor}:3 1100 20 {sensor}:3 2000 30
1) (integer) 1000
2) (integer) 1100
3) (integer) 2000
redis> TS.MADD {sensor}:4 1000 5 {sensor}:4 1100 15 {sensor}:4 2000 25
1) (integer) 1000
2) (integer) 1100
3) (integer) 2000
redis> TS.NREVRANGE 2 {sensor}:3 {sensor}:4 - + AGGREGATION avg sum 1000
1) 1) (integer) 2000
2) 1) 30
2) 25
2) 1) (integer) 1000
2) 1) 15
2) 20
Apply multiple aggregators to a series
要计算单个键的多个聚合器,请将它们作为逗号分隔的列表传递。这里{sensor}:3使用avg,max(两个值),{sensor}:4使用sum(一个值)。每个时间戳的值都是一个单一的平面列表:{sensor}:3 的 avg,然后是 max,然后是 {sensor}:4 的 sum。
redis> TS.NREVRANGE 2 {sensor}:3 {sensor}:4 - + AGGREGATION avg,max sum 1000
1) 1) (integer) 2000
2) 1) 30
2) 30
3) 25
2) 1) (integer) 1000
2) 1) 15
2) 20
3) 20
详细说明
语义
TS.NREVRANGE 的行为类似于在每个输入键上运行兼容的 TS.REVRANGE,然后按时间戳执行服务器端外连接。行从最高时间戳返回到最低时间戳。
在原始模式下(无 AGGREGATION):
- 为至少一个键生成的每个不同时间戳返回一个条目。
- 如果某个键在该时间戳处没有样本,则该键的值为
NaN。
在聚合模式下(使用 AGGREGATION):
- 一个聚合按键顺序应用于每个键;这些参数的数量必须等于
numkeys,并且所有键共享一个bucketDuration。 - 每个键参数都是一个聚合器或以逗号分隔的聚合器列表,并且一个键为每个聚合器贡献一个值。
- 每个时间戳的值形成一个单一的平面列表,按键排序,并且在每个键内按其聚合器的列出顺序排序。例如,第一个键的
avg,max和第二个键的sum生成[avg, max, sum]形式的值。 - 当某个键没有给定存储桶的数据时,该键的所有值都是
NaN。 - 使用
EMPTY,空桶可以生成其中每个值都是NaN的行。
NaN值
NaN 值可能意味着键在该时间戳处没有样本或在该时间段没有样本,或者该键存储或聚合到真实的 NaN。这两种情况在回复中是没有区别的。
| 案件 | 价值 |
|---|---|
| 键在该时间戳有一个样本 | 样本值 |
| 键在该时间戳没有样本 | NaN |
| Key 已聚合该时间段的数据 | 合计值 |
| Key当时桶中没有样本 | NaN |
键存储或聚合到真实的 NaN |
NaN,与无数据无法区分 |
Redis Software 与 Redis Cloud 兼容性
| Redis 软件 |
Redis Cloud |
说明 |
|---|---|---|
| ❌ 不支持 |
❌ 灵活且每年 ❌免费和固定 |
返回值
RESP2
以下之一: * 数组回复 每个时间戳一个条目,按时间戳递减排序。每个条目都是由 整数回复(时间戳)和 简单字符串回复 值的平面 数组回复 组成的 数组回复。这些值按输入顺序跨键连接;使用 AGGREGATION,每个键为每个聚合器贡献一个值,否则每个键贡献一个值。缺失值报告为 NaN。当没有样本匹配时,回复是一个空数组。 * 简单错误回复 在这些情况下:无效的参数、错误的聚合器数量、未知的聚合类型、错误的键类型等。
RESP3
以下之一: * 数组回复 每个时间戳一个条目,按时间戳递减排序。每个条目都是由 整数回复(时间戳)和 双重回复 值的平面 数组回复 组成的 数组回复。这些值按输入顺序跨键连接;使用 AGGREGATION,每个键为每个聚合器贡献一个值,否则每个键贡献一个值。缺失值报告为 NaN。当没有样本匹配时,回复是一个空数组。 * 简单错误回复 在这些情况下:无效的参数、错误的聚合器数量、未知的聚合类型、错误的键类型等。
参见
TS.NRANGE | TS.REVRANGE | TS.MREVRANGE
相关主题
资料来源:Redis 官方 TS.NREVRANGE 文档;中文内容参考 Redis 文档许可。