点 Redis 8 已到来——而且它是开源的

了解更多

RedisTimeSeries 1.6 发布啦!

今天,我们很高兴宣布 RedisTimeSeries 1.6 正式发布。这篇博客文章详细介绍了现已推出的主要新特性。

关于 RedisTimeSeries

RedisTimeSeries 是一个高性能、内存优先的 Redis 时间序列数据结构。RedisTimeSeries 支持时间序列多租户(可同时容纳多个时间序列),并可同时为多个访问这些时间序列的客户端提供服务。现在,它也是 Redis Stack 的一部分。

RedisTimeSeries 1.6 的主要新特性

  • 增强的查询功能
    • 跨时间序列聚合
    • 按时间戳或样本值过滤结果
    • 选择要检索的标签
    • 对齐聚合桶
      删除样本
  • 性能提升
  • 键空间通知
  • Redis Enterprise 对 Redis on Flash 的支持

增强的查询功能

跨时间序列聚合

在 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-1138815008.07%
tsbs-scale100_double-groupby-11001088.00%
tsbs-scale100_groupby-orderby-limit793128261.66%
tsbs-scale100_single-groupby-1-1-1134482134758.74%
tsbs-scale100_single-groupby-1-1-122383392164.54%

与 RedisTimeSeries 1.4 相比,我们可以看到每秒查询数有 8% 到 65% 的提升。

键空间通知

Redis 键空间通知 允许 Redis 客户端订阅 Pub/Sub 频道,以接收以某种方式影响 Redis 数据集的事件。例如,您可以使用 RedisGears 通过这些通知触发函数。

例如,可以实现一个时间序列预测器或异常检测器,它监听样本流并生成实时预测和警告。
例如,查看此测试,它订阅各种 RedisTimeSeries 命令并生成事件。

Redis Enterprise 对 Redis on Flash 的支持

自 1.6 版本以来,RedisTimeSeries 可以在 Redis on Flash 中运行,但需要注意的是,RoF 是在键级别实现的。也就是说,整个时间序列的值要么存储在 FLASH 上,要么存储在 RAM 中。

RedisTimeSeries 是 Redis Stack 的一部分

RedisTimeSeries 现在是 Redis Stack 的一部分。您可以下载适用于 macOS、Ubuntu 或 Redhat 的最新 Redis Stack Server 二进制文件,或通过 Docker、Homebrew 或 Linux 进行安装。

使用 RedisInsight 可视化时间序列数据

RedisInsight 是一个面向开发人员的可视化工具,提供了在使用 Redis 或 Redis Stack 进行开发期间探索 RedisTimeSeries 数据的绝佳方式。 

您可以直接从图形用户界面执行时间序列查询并观察结果。RedisInsight 现在可以可视化 RedisTimeSeries 查询结果。

redistimeseries 1.6 aggregation chart

此外,RedisInsight 包含快速指南和教程,可用于交互式学习 RedisTimeSeries。

redistimeseries 1.6 line graph

redis.iodeveloper.redis.com 上了解更多关于 RedisTimeSeries 的信息。