快速入门
时间序列快速入门指南
设置
您可以在云中、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
此查询将显示所有具有值为 32
的 area_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 开始)您可以使用 GROUPBY
和 REDUCE
选项按标签对其进行分组,并应用额外的聚合。
例如,要查找每个区域的最低温度,我们可以运行
TS.MRANGE - + FILTER region=(east,west) GROUPBY region REDUCE min