视频
了解更多
今天,我们很高兴宣布 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 子句只保留表示股票价格的单个时间序列。GROUPBY type REDUCE max 子句将时间序列按相同的类型值分组,然后对于每个时间戳,使用 max 聚合器聚合共享相同类型值的所有序列。
FILTER label=value 受 TS.MRANGE 和 TS.MREVRANGE 支持。还支持其他过滤子句(参见文档)。
接下来,我们将演示第二种新的聚合类型
首先,创建两个股票,并在 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 受 TS.MRANGE 和 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 的信息。