快速入门

时间序列快速入门指南

设置

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

Redis 云服务

Redis 时间序列在所有 Redis Cloud 托管服务中均可用,包括完全免费的托管数据库,容量可达 30MB。

从这里开始

Docker

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

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

下载并运行二进制文件

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

接下来,使用 RedisTimeSeries 运行 Redis:

$ 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虚拟环境,
  • 使用带有--volume选项的Docker来创建一个隔离的构建环境。

构建

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)。例如,如果您在一天内收集了超过十亿个数据点,您可以按每分钟聚合数据以进行降采样,从而将数据集大小减少到 24 * 60 = 1,440 个数据点。您可以选择多种可用的聚合类型之一,以将某个分钟内的多个数据点聚合为一个。当前支持的聚合类型有:avg, sum, min, max, range, count, first, last, std.p, std.s, var.p, var.s 和 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

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

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

TS.MGET FILTER area_id=32

按值过滤

我们可以通过单个或多个时间序列的值进行过滤:

TS.RANGE sensor1 - + FILTER_BY_VALUE 25 30

此命令将返回所有值在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 ↑