快速入门
时间序列快速入门指南
设置
您可以在云端、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起)您可以使用GROUPBY和REDUCE选项按标签分组并应用额外的聚合。
要找到每个地区的最低温度,例如,我们可以运行:
TS.MRANGE - + FILTER region=(east,west) GROUPBY region REDUCE min