快速入门

时间序列快速入门指南

设置

您可以在云中、Docker 容器中或您自己的机器上设置 RedisTimeSeries。

Redis 云

所有 Redis 云托管服务(包括高达 30 MB 的完全免费托管数据库)都提供 Redis 时间序列。

在此处开始使用

Docker

要快速试用 Redis 时间序列,请使用 docker 启动 Redis Stack 实例。

docker run -p 6379:6379 -it --rm redis/redis-stack-server

下载和运行二进制文件

首先从 Redis 下载中心 下载预编译版本。

接下来,运行 Redis 和 RedisTimeSeries

$ redis-server --loadmodule /path/to/module/redistimeseries.so

自己构建和运行

您也可以在您自己的机器上构建和运行 RedisTimeSeries。

主要 Linux 发行版以及 macOS 都受支持。

要求

首先,从 git 克隆 RedisTimeSeries 存储库

git clone --recursive https://github.com/RedisTimeSeries/RedisTimeSeries.git

然后,要安装所需的构建工件,请调用以下命令

cd RedisTimeSeries
make setup

或者,您可以手动安装 system-setup.py 中列出的必需依赖项。

如果 make 尚不可用,则以下命令等效

./deps/readies/bin/getpy3
./system-setup.py

请注意,system-setup.py **将使用系统自带的包管理器和 pip 在您的系统上安装各种包**。这需要在 Linux 上拥有 root 权限(即 sudo)。

如果您希望避免这种情况,您可以

  • 查看 system-setup.py 并手动安装软件包,
  • 使用 Python 虚拟环境,
  • 使用 Docker 以及 --volume 选项来创建一个隔离的构建环境。

构建

make build

二进制文件位于 bin 目录下。

运行

在您的 redis-server 中运行:loadmodule bin/redistimeseries.so

有关模块的更多信息,请访问 redis 官方文档

使用 redis-cli 试用

设置好 RedisTimeSeries 后,您可以使用 redis-cli 与它交互。

$ redis-cli
127.0.0.1:6379> TS.CREATE sensor1
OK

创建时间序列

可以使用 TS.CREATE 命令创建一个新的时间序列;例如,要创建一个名为 sensor1 的时间序列,请运行以下命令:

TS.CREATE sensor1

您可以使用 RETENTION 选项设置样本相对于最后一个事件时间的最大年龄(以毫秒为单位),以防止时间序列无限增长。保留期默认值为 0,这意味着系列不会被修剪。

TS.CREATE sensor1 RETENTION 2678400000

这将创建一个名为 sensor1 的时间序列,并将它修剪为最多一个月的值。

添加数据点

要向时间序列添加新的数据点,我们使用 TS.ADD 命令

TS.ADD key timestamp value

timestamp 参数是以毫秒为单位的样本的 UNIX 时间戳,value 是样本的数值数据。

示例

TS.ADD sensor1 1626434637914 26

添加带有当前时间戳的数据点,可以使用 * 代替特定时间戳

TS.ADD sensor1 * 26

您可以使用 TS.MADD 命令将数据点追加到多个时间序列

TS.MADD key timestamp value [key timestamp value ...]

删除数据点

可以使用 TS.DEL 命令删除两个时间戳之间(包括)的数据点。

TS.DEL key fromTimestamp toTimestamp

示例

TS.DEL sensor1 1000 2000

要删除单个时间戳,请将其用作“from”和“to”时间戳。

TS.DEL sensor1 1000 1000

注意: 当删除样本时,所有降采样时间序列中的数据将针对特定桶重新计算。但是,如果桶的一部分已经因为超出保留期而被删除,我们就无法重新计算整个桶,在这种情况下,我们将拒绝删除操作。

标签

标签是附加到数据点的键值元数据,允许我们进行分组和过滤。它们可以是字符串或数值,并在创建时添加到时间序列中。

TS.CREATE sensor1 LABELS region east

压缩

Redis 时间序列的另一个有用功能是通过为压缩创建规则来压缩数据 (TS.CREATERULE)。例如,如果您在一整天内收集了超过 10 亿个数据点,您可以按分钟聚合数据以对其进行降采样,从而将数据集大小减少到 24 * 60 = 1,440 个数据点。您可以选择许多可用的聚合类型之一,以便将某个分钟的多个数据点聚合到一个数据点中。当前支持的聚合类型有:avg, sum, min, max, range, count, first, last, std.p, std.s, var.p, var.s and twa

重要的是要注意,原始时间序列上没有数据重写;压缩发生在一个新系列中,而原始系列保持不变。为了防止原始时间序列无限增长,您可以使用保留选项,它会将它修剪到一定的时间段内。

注意: 您需要在创建规则之前创建目标(压缩后的)时间序列。

TS.CREATERULE sourceKey destKey AGGREGATION aggregationType bucketDuration

示例

TS.CREATE sensor1_compacted  # Create the destination timeseries first
TS.CREATERULE sensor1 sensor1_compacted AGGREGATION avg 60000   # Create the rule

使用此创建规则,添加到 sensor1 时间序列的数据点将被分组到 60 秒(60000 毫秒)的桶中,求平均值,并保存到 sensor1_compacted 时间序列中。

过滤

您可以按值、时间戳和标签过滤时间序列。

按标签过滤

您可以在同一个查询中检索多个时间序列中的数据点,方法是使用标签过滤器。例如

TS.MRANGE - + FILTER area_id=32

此查询将显示所有具有值为 32area_id 标签的传感器(时间序列)的数据。结果将按时间序列分组。

或者,我们也可以使用 TS.MGET 命令来获取与特定过滤器匹配的最后一个样本。

TS.MGET FILTER area_id=32

按值过滤

我们可以在单个或多个时间序列中按值进行过滤

TS.RANGE sensor1 - + FILTER_BY_VALUE 25 30

此命令将返回所有值位于 25 和 30 之间(包括)的数据点。

要对多个系列实现相同的过滤,我们必须将按值过滤与按标签过滤结合起来。

TS.MRANGE - +  FILTER_BY_VALUE 20 30 FILTER region=east

按时间戳过滤

要检索一个或多个时间序列上特定时间戳的数据点,我们可以使用 FILTER_BY_TS 参数

在一个时间序列上过滤

TS.RANGE sensor1 - + FILTER_BY_TS 1626435230501 1626443276598

在多个时间序列上过滤

TS.MRANGE - +  FILTER_BY_TS 1626435230501 1626443276598 FILTER region=east

聚合

通过利用聚合函数,可以组合一个或多个时间序列的值。

TS.RANGE ... AGGREGATION aggType bucketDuration...

例如,要查找我们的 sensor1 系列中每小时的平均温度,我们可以运行

TS.RANGE sensor1 - + + AGGREGATION avg 3600000

要对 id 为 32 的区域中的多个传感器实现相同的操作,我们将运行

TS.MRANGE - + AGGREGATION avg 3600000 FILTER area_id=32

聚合桶对齐

在进行聚合时,聚合桶将与 0 对齐,如下所示

TS.RANGE sensor3 10 70 + AGGREGATION min 25
Value:        |      (1000)     (2000)     (3000)     (4000)     (5000)     (6000)     (7000)
Timestamp:    |-------|10|-------|20|-------|30|-------|40|-------|50|-------|60|-------|70|--->

Bucket(25ms): |_________________________||_________________________||___________________________|
                           V                          V                           V
                  min(1000, 2000)=1000      min(3000, 4000)=3000     min(5000, 6000, 7000)=5000

我们将获得以下数据点:1000、3000、5000。

您可以选择将桶与查询区间的开始或结束对齐,如下所示

TS.RANGE sensor3 10 70 + AGGREGATION min 25 ALIGN start
Value:        |      (1000)     (2000)     (3000)     (4000)     (5000)     (6000)     (7000)
Timestamp:    |-------|10|-------|20|-------|30|-------|40|-------|50|-------|60|-------|70|--->

Bucket(25ms):          |__________________________||_________________________||___________________________|
                                    V                          V                           V
                        min(1000, 2000, 3000)=1000      min(4000, 5000)=4000     min(6000, 7000)=6000

结果数组将包含以下数据点:1000、4000 和 6000。

跨时间序列的聚合

默认情况下,多个时间序列的结果将按时间序列分组,但(从 v1.6 开始)您可以使用 GROUPBYREDUCE 选项按标签对其进行分组,并应用额外的聚合。

例如,要查找每个区域的最低温度,我们可以运行

TS.MRANGE - + FILTER region=(east,west) GROUPBY region REDUCE min
RATE THIS PAGE
Back to top ↑