视频

了解更多
今天,我们很高兴宣布 RedisTimeSeries 1.6 正式发布。这篇博文详细介绍了现在可用的主要新功能。
RedisTimeSeries 是 Redis 的一个高性能、内存优先的时间序列数据结构。RedisTimeSeries 支持时间序列多租户(它可以同时保存多个时间序列)并且可以服务于同时访问这些时间序列的多个客户端。它现在也作为 Redis Stack 的一部分提供。
在 1.6 版之前,只有一种聚合类型是可能的
从 1.6 版开始,两种新的聚合类型是可能的
让我们演示第一个新的聚合类型。首先,让我们创建两只股票,并在 3 个不同的时间戳添加它们的价格
TS.CREATE stock:A LABELS type stock name A
TS.CREATE stock:B LABELS type stock name B
TS.MADD stock:A 1000 100 stock:A 1010 110 stock:A 1020 120
TS.MADD stock:B 1000 120 stock:B 1010 110 stock:B 1020 100
现在,我们可以检索每个时间戳的最大股票价格
redis:6379> TS.MRANGE - + WITHLABELS FILTER type=stock GROUPBY type
REDUCE max
1) 1) "type=stock" 2) 1) 1) "type" 2) "stock" 2) 1) "__reducer__" 2) "max" 3) 1) "__source__" 2) "stock:A,stock:B" 3) 1) 1) (integer) 1000 2) 120 2) 1) (integer) 1010 2) 110 3) 1) (integer) 1020 2) 120 |
The FILTER type=stock clause leaves us only with a single time series representing stock prices. The GROUPBY type REDUCE max clause splits the time series into groups with identical type values, and then, for each timestamp, aggregates all series that share the same type value using the max aggregator.
FILTER label=value is supported by TS.MRANGE and TS.MREVRANGE. Additional filtering clauses are supported as well (see documentation).
接下来,我们将演示第二个新的聚合类型
首先,让我们创建两只股票,并在 9 个不同的时间戳添加它们的价格。
TS.CREATE stock:A LABELS type stock name A
TS.CREATE stock:B LABELS type stock name B
TS.MADD stock:A 1000 100 stock:A 1010 110 stock:A 1020 120
TS.MADD stock:B 1000 120 stock:B 1010 110 stock:B 1020 100
TS.MADD stock:A 2000 200 stock:A 2010 210 stock:A 2020 220
TS.MADD stock:B 2000 220 stock:B 2010 210 stock:B 2020 200
TS.MADD stock:A 3000 300 stock:A 3010 310 stock:A 3020 320
TS.MADD stock:B 3000 320 stock:B 3010 310 stock:B 3020 300
现在,对于每只股票,我们将计算每 1000 毫秒时间帧的平均股票价格,然后检索该时间帧内平均价格最大的股票
最大平均值
redis:6379> TS.MRANGE - + WITHLABELS AGGREGATION avg 1000 FILTER type=stock GROUPBY type REDUCE max
1) 1) "type=stock" 2) 1) 1) "type" 2) "stock" 2) 1) "__reducer__" 2) "max" 3) 1) "__source__" 2) "stock:A,stock:B" 3) 1) 1) (integer) 1000 2) 110 2) 1) (integer) 2000 2) 210 3) 1) (integer) 3000 2) 310 |
GROUPBY label REDUCE reducer is supported by TS.MRANGE and TS.MREVRANGE.
Reducer 可以是 sum、min 或 max。
当使用 TS.RANGE, TS.REVRANGE, TS.MRANGE, 和 TS.MREVRANGE 时,您并不总是希望检索或聚合所有样本。
使用 [FILTER_BY_TS ts...] 可以按特定时间戳列表过滤样本。
使用 [FILTER_BY_VALUE min max] 可以按最小值和最大值过滤样本。
例如,考虑一个采样指标,其中正常值在 -100 到 100 之间,但值 9999 用作不良测量的指示。
TS.CREATE temp:TLV LABELS type temp location TLV
TS.MADD temp:TLV 1000 30 temp:TLV 1010 35 temp:TLV 1020 9999
temp:TLV 1030 40
现在,让我们检索所有值,忽略超出范围的值
TS.RANGE temp:TLV - + FILTER_BY_VALUE -100 100
让我们也检索平均值,忽略超出范围的值
TS.RANGE temp:TLV - + FILTER_BY_VALUE -100 100 AGGREGATION avg 1000
当使用 TS.MRANGE, TS.MREVRANGE, 和 TS.MGET 时,我们并不总是希望获得与匹配时间序列相关联的所有标签的值,而只希望获得选定标签的值。
SELECTED_LABELS 允许选择要检索的标签。给定以下时间序列和数据
TS.CREATE temp:TLV LABELS type temp location TLV
TS.MADD temp:TLV 1000 30 temp:TLV 1010 35 temp:TLV 1020 9999
temp:TLV 1030 40
要获得与匹配时间序列相关联的所有标签,我们将使用 WITHLABELS
redis:6379> TS.MGET WITHLABELS FILTER type=temp
1) 1) "temp:TLV" 2) 1) 1) "type" 2) "temp" 2) 1) "location" 2) "TLV" 3) 1) (integer) 1030 2) 40 |
但假设我们只想要位置,我们可以使用 SELECTED_LABELS:
redis:6379> TS.MGET SELECTED_LABELS location FILTER type=temp
1) 1) "temp:TLV" 2) 1) 1) "location" 2) "TLV" 3) 1) (integer) 1030 2) 40 |
假设我们希望收到每天的平均温度,但我们的“一天”从 06:00 开始。在这种情况下,我们希望将间隔对齐到 06:00 到 05:59,而不是对齐到 00:00 到 23:59。
当使用 TS.RANGE, TS.REVRANGE, TS.MRANGE, 和 TS.MREVRANGE 时,现在可以使用 ALIGN 将聚合桶与请求的开始、结束或特定时间戳对齐。
为了演示对齐,让我们添加以下数据
TS.CREATE stock:A LABELS type stock name A
TS.MADD stock:A 1000 100 stock:A 1010 110 stock:A 1020 120
TS.MADD stock:A 1030 200 stock:A 1040 210 stock:A 1050 220
TS.MADD stock:A 1060 300 stock:A 1070 310 stock:A 1080 320
接下来,我们将不使用 ALIGN 进行聚合(这意味着默认对齐:0)
redis: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
redis: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) 1030 2) 200 4) 1) (integer) 1050 2) 220 5) 1) (integer) 1070 2) 310 |
将 ALIGN 设置为 10 表示桶应从时间 10 开始,所有桶(每个桶的持续时间为 20 毫秒)都相应对齐。
当范围查询的开始时间戳被明确说明(不是‘-’)时,也可以通过将 align 设置为‘-’或‘start‘将 ALIGN 设置为该时间。
redis: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) 1025 2) 200 4) 1) (integer) 1045 2) 220 5) 1) (integer) 1065 2) 310 |
类似地,当范围查询的结束时间戳被明确说明(不是‘+’)时,也可以通过将 align 设置为‘+’或‘end’将 ALIGN 设置为该时间。
TS.DEL 允许在两个时间戳内删除给定时间序列中的样本。
例如,TS.DEL stock:A 1020 1050 将删除时间戳在 1020 和 1050(包含)之间的时间序列的所有样本。返回值是删除的样本数量。
实现了许多优化,与 RedisTimeSeries 1.4 相比,现在大多数查询的执行速度要快得多。
下表详细列出了单个节点上可实现的每秒查询数,用于 TSBS 查询(我们在这里进行了描述)。该表仅列出了版本 1.4 中支持的 TSBS 查询子集。
查询类型 | 1.4 查询/秒 | v1.6 查询/秒 | % 变化(越高越好) |
tsbs-scale100_cpu-max-all-1 | 1388 | 1500 | 8.07% |
tsbs-scale100_double-groupby-1 | 100 | 108 | 8.00% |
tsbs-scale100_groupby-orderby-limit | 793 | 1282 | 61.66% |
tsbs-scale100_single-groupby-1-1-1 | 13448 | 21347 | 58.74% |
tsbs-scale100_single-groupby-1-1-12 | 2383 | 3921 | 64.54% |
与 RedisTimeSeries 1.4 相比,我们可以观察到每秒查询数提高了8% 到 65%。
Redis 键空间通知 允许 Redis 客户端订阅 Pub/Sub 频道,以便接收以某种方式影响 Redis 数据集的事件。例如,您可以使用 RedisGears 来触发具有这些通知的函数。
例如,可以实现一个时间序列预测器或异常检测器,它监听样本流并生成实时预测和警告。
例如,请查看此测试,它订阅了各种 RedisTimeSeries 命令并生成事件。
从 1.6 版开始,RedisTimeSeries 可以在 Redis on Flash 上运行,但需要注意的是,RoF 是在键级别实现的。也就是说,整个时间序列的值要么位于 FLASH 上,要么位于 RAM 上。
RedisTimeSeries 现在是 Redis Stack 的一部分。您可以下载适用于 macOS、Ubuntu 或 Redhat 的最新 Redis Stack Server 二进制文件,或使用 Docker、Homebrew 或 Linux 安装它们。
RedisInsight 是一个面向开发人员的可视化工具,它提供了一种绝佳的方式来使用 Redis 或 Redis Stack 在开发过程中探索 RedisTimeSeries 中的数据。
您可以执行时间序列查询并直接从图形用户界面观察结果。RedisInsight 现在可以可视化 RedisTimeSeries 查询结果。
此外,RedisInsight 包含快速指南和教程,可以帮助您以交互方式学习 RedisTimeSeries。
在 redis.io 和 developer.redis.com 上了解有关 RedisTimeSeries 的更多信息。