热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

redis之如何存储时间序列数据

写在前面本文一起来看下redis如何处理时序数据。1:什么是时序数据随着时间的推移不断产生的数据,我们可以将其称之为时序数据,比如设




写在前面

本文一起来看下redis如何处理时序数据。


1:什么是时序数据

随着时间的推移不断产生的数据,我们可以将其称之为时序数据,比如设备的运行状态,每隔一分钟产生一组状态指标,然后存储,这些标记了设备不同时刻运行状态的数据,就是时序数据的一种,而专门用来设计存储这些数据的数据库我们可以叫做是TSDB(time series database,即时序数据库),比如InfluxDB,TDengine,就是这一类的数据库,我们本文所包含的RedisTimeSeries准确来说也属于这个范畴,但是是通过redis扩展模块方式实现的。


2:提出需求

假设现在有这样的需求,需要收集设备的运行信息,包括设备温度,湿度,压强等信息,而这些信息每隔3分钟就会上报一次,并且需要满足如下要求:

1:数据插入速度快
2:支持点查询,即查询一个点的数据
3:支持范围查询,即查询某时间范围内的数据
4:支持聚合操作,如max,avg等

对于"1:数据插入速度快 “,正常情况下redis是满足我们的需求的,对于"2:支持点查询,即查询一个点的数据”,我们可以使用hash存储,像下图:

在这里插入图片描述

对于"3:支持范围查询,即查询某时间范围内的数据"我们可以使用set来实现,比如使用时间当分数,然后使用ZRANGEBYSCORE 就可以实现范围查询了,如下图:

在这里插入图片描述

因此到这里,我们需要将数据在hash结构和sorted set结构中各存储一份,那么就需要考虑原子性的问题,两边的数据如果是不一致的,则会出现业务上的错误,为了解决这个问题,我们需要用到redis提供的简单事务支持 ,如下原理和实例:

在这里插入图片描述

在这里插入图片描述

对于"4:支持聚合操作,如max,avg等",我们就需要将数据读取到客户端来计算结果了,而这种方式有个问题就是,如果是数据过大的话会大量占用服务器的网络资源,可能会影响到正常业务请求,此时我们可以考虑使用RedisTimeSeries了,这也正是本文我们要分析的重点,RedisTimeSeries是redis的扩展模块,需要获取对应的动态链接库,然后加载模块到redis的功能中,这里的动态链接库是redistimeseries.so,可以通过如下的几种方式获取:

1:编译源代码
2:从对应的docker镜像中获取
3:下载我已经获取的

对于1,我没有成功,因为github我访问不了o(╥﹏╥)o,对于2操作如下:

[root@localhost RedisTimeSeries]# docker pull redislabs/redistimeseries
Using default tag: latest
Trying to pull repository docker.io/redislabs/redistimeseries ...
latest: Pulling from docker.io/redislabs/redistimeseries
6ec7b7d162b2: Pull complete
...
50e2b1edfcc3: Pull complete
Digest: sha256:98e18d974673da04f009bb36e403ee797faed24560a291bf57b9e8a727e3151d
Status: Downloaded newer image for docker.io/redislabs/redistimeseries:latest
[root@localhost RedisTimeSeries]# docker run docker.io/redislabs/redistimeseries
1:C 08 Nov 2022 08:35:39.196 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
...
1:M 08 Nov 2022 08:35:39.198 * Module 'timeseries' loaded from /usr/lib/redis/modules/redistimeseries.so
1:M 08 Nov 2022 08:35:39.198 * Ready to accept connections
[root@localhost ~]# docker cp heuristic_cori:/usr/lib/redis/modules/redistimeseries.so /root/study
[root@localhost ~]# cd /root/study/
[root@localhost study]# ll
total 152
...
-rwxr-xr-x. 1 root root 147576 Jul 5 2021 redistimeseries.so

对于3可以从这里 下载。动态链接库准备完毕后,需要配置到redis.conf中如下:

loadmodule /root/study/redistimeseries.so DUPLICATE_POLICY LAST

具体路径注意修改成自己的,接下看下具体的数据操作。


  • 插入数据
    插入数据前必须先通过TS.CREATE来创建集合,格式TS.CREATE key RETENTION 超时毫秒数 LABELS 标签名称 标签值 标签名称 标签值,集合创建完毕后通过TS.ADD来向集合中插入数据,格式TS.ADD key 秒值 值,如下我们测试创建记录4个设备的温度信息的集合,四个设备的设备ID假设分别为AAAA,BBBB,CCCC,DDDD,如下首先创建集合:

127.0.0.1:6379> TS.CREATE device:temperature:AAAA RETENTION 600000 LABELS device_id AAAA
OK
127.0.0.1:6379> TS.CREATE device:temperature:BBBB RETENTION 600000 LABELS device_id BBBB
OK
127.0.0.1:6379> TS.CREATE device:temperature:CCCC RETENTION 600000 LABELS device_id CCCC
OK
127.0.0.1:6379> TS.CREATE device:temperature:DDDD RETENTION 600000 LABELS device_id DDDD
OK

然后向其中分别插入一些测试数据:

127.0.0.1:6379> TS.ADD device:temperature:AAAA 1667980462 66.5
(integer) 1667980462
127.0.0.1:6379> TS.ADD device:temperature:AAAA 1667980463 69.3
(integer) 1667980463
127.0.0.1:6379> TS.ADD device:temperature:BBBB 1667980468 79.3
(integer) 1667980468
127.0.0.1:6379> TS.ADD device:temperature:BBBB 1667980469 79.5
(integer) 1667980469
127.0.0.1:6379> TS.ADD device:temperature:CCCC 1667980470 79.4
(integer) 1667980470
127.0.0.1:6379> TS.ADD device:temperature:CCCC 1667980471 77.4
(integer) 1667980471
127.0.0.1:6379> TS.ADD device:temperature:DDDD 1667980477 79.4
(integer) 1667980477
127.0.0.1:6379> TS.ADD device:temperature:DDDD 1667980478 79.9
(integer) 1667980478

  • 查询最新的一条数据
    命令TS:GET,格式TS:GET key options,会返回最新的一条数据,如下:

127.0.0.1:6379> TS.GET device:temperature:AAAA
1) (integer) 1667980463
2) 69.3
127.0.0.1:6379> TS.GET device:temperature:BBBB
1) (integer) 1667980469
2) 79.5

  • 查询一批最新数据
    命令TS.MGET ,格式TS.MGET FILTER 基于标签的表达式,如下:

127.0.0.1:6379> TS.MGET filter device_id=DDDD
1) 1) "device:temperature:DDDD"
2) (empty list or set)
3) 1) (integer) 1667980478
2) 79.9
127.0.0.1:6379> TS.MGET withlabels filter device_id=DDDD
1) 1) "device:temperature:DDDD"
2) 1) 1) "device_id"
2) "DDDD"
3) 1) (integer) 1667980478
2) 79.9

  • 聚合运算
    使用命令TS.RANGE,格式TS.RANGE key 开始时间 结束时间 AGGREGATION [avg|max|min|sum等] 时间窗口毫秒数,其中时间窗口毫秒数意思是,指定的时间范围内多长的时间区间执行指定的聚合运算,如下:

127.0.0.1:6379> TS.RANGE device:temperature:AAAA 1667980462 1667980463 AGGREGATION sum 180000
1) 1) (integer) 1667880000
2) 135.8

写在后面

参考文章列表:

时间序列数据库 (TSDB) 。







推荐阅读
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 本文介绍了如何使用PHP代码将表格导出为UTF8格式的Excel文件。首先,需要连接到数据库并获取表格的列名。然后,设置文件名和文件指针,并将内容写入文件。最后,设置响应头部,将文件作为附件下载。 ... [详细]
  • 本文介绍了如何在Azure应用服务实例上获取.NetCore 3.0+的支持。作者分享了自己在将代码升级为使用.NET Core 3.0时遇到的问题,并提供了解决方法。文章还介绍了在部署过程中使用Kudu构建的方法,并指出了可能出现的错误。此外,还介绍了开发者应用服务计划和免费产品应用服务计划在不同地区的运行情况。最后,文章指出了当前的.NET SDK不支持目标为.NET Core 3.0的问题,并提供了解决方案。 ... [详细]
author-avatar
痞子彪2012_890
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有