物联网平台搭建的全过程介绍(六)——物联网TSDB之基本知识及读写代码介绍

article/2025/9/3 2:29:40

目录

一、TSDB基本知识

二、物联网平台数据流通架构

三、TSDB数据结构

1、TSDB数据包的组成

2、TSDB的另外两个相关概念

四、阿里云物联网平台实例内TSDB功能介绍

1、数据写入

(1)需要添加的依赖

(2)写入数据代码

2、数据查询

(1)需要添加的依赖

(2)时间点查询

(4)时间戳与北京时间转换在线工具

  3、数据管理


一、TSDB基本知识

时间序列数据库 (Time Series Database , 简称 TSDB) 是一种高性能、低成本、稳定可靠的在线时间序列数据库,具备百万级/秒的写入速度,具有高压缩比低成本存储、预降采样、插值、多维聚合计算、可视化查询结果等功能。因此TSDB广泛应用于物联网(IoT)设备监控系统。

TSDB与其他数据库最为明显的区别就是,其数据是按数据所绑定的时间戳顺序进行存储的。注意,数据绑定的这个时间是那条数据在设备端发生的时间,而不是网络发送或接收的时间,这个时间做为一个属性是随着数据参与了数据流转的所有过程。

打个比方,国家某个部委发了一个文件,文件内一定会写明文件发布的日期,这个日期是文件的附属内容。当这个文件从部委下发到厅局,由厅局再下发市局,市局再下发县局,县局再下发到所属各个单位。文件下发转发的所有过程,文件发布的时间都会随着文件而一起流通。那么接收文件的单位,一般不会按接收到文件的时间,而是按文件内注明的发布时间来进行存档。

二、物联网平台数据流通架构

设备将原始数据通过 MQTT 协议发送到物联网平台,经由物联网平台将数据转发到消息服务系统,继而通过流计算系统对这些数据进行实时计算处理后写入到 TSDB 中存储,或者经由物联网平台直接将原始数据写入 TSDB 中存储。前端的监控系统和大数据处理系统会利用 TSDB 的数据查询和计算分析能力进行业务监控和分析结果的实时展现。

下图为架构示意图,图中监控展现为手机等移动设备或者PC机,MQTT物联网设备接入就是物联网平台,从图中可以发现,在实际应用中,只是把被监控的设备通过网关接入了物联网平台,而没有把监控端也接入物联网平台。这样设计的原因主要有两点:第一,物联网平台的设备数是有限的,而监控展现端数量可能会很大,如果把监控端也接入物联网平台,那一定会严重占用物联网平台资源。第二,物联网平台只是一个信息流通的枢纽,主要功能是负责数据的接收和转发,其存储的功能一般不会很强大,存储数据的时间一般不会很长,所以物联网平台把设备的数据流转到TSDB,再由用户访问TSDB会更合理。

三、TSDB数据结构

TSDB数据库内存放的是一条条TSDB数据包,下边介绍一下TSDB数据包的具体内容和组成结构。

1、TSDB数据包的组成

一条TSDB数据其包含以下四部分内容:

  • 度量(Metric):监测数据的指标,例如风力和温度。

  • 标签(Tag):度量(Metric)虽然指明了要监测的指标项,但没有指明要针对什么对象的该指标项进行监测。标签(Tag)就是用于表明指标项监测针对的具体对象,属于指定度量下的数据子类别。

    一个标签(Tag)由一个标签键(TagKey)和一个对应的标签值(TagValue)组成。

    注意:当标签键和标签值都相同才算同一个标签;标签键相同,标签值不同,则不是同一个标签。另外还需要注意一个Metric可以有多个Tag。

  • 值(Value):度量对应的值,例如 15 级(风力)和 20 ℃(温度)。注意,Value值有数值型和字符型两种。

  • 时间戳(Timestamp):数据(度量值)产生的时间点。

2、TSDB的另外两个相关概念

  • 数据点 (Data Point):针对监测对象的某项指标(由度量和标签定义)按特定时间间隔(连续的时间戳)采集的每个度量值就是一个数据点。“一个度量 + N 个标签(N >= 1)+ 一个时间戳 + 一个值”定义一个数据点。一个数据点就是这个Metric在tsdb存储的一条具体记录。

  • 时间序列(Time Series):针对某个监测对象的某项指标(由度量和标签定义)的描述。“一个度量 + N 个标签KV组合(N >= 1)”定义为一个时间序列,某个时间序列上产生的数据值的增加,不会导致时间序列的增加。这句话的意思就是,对于同一个Metric,对于不同的Tags组合,都有不同的时间序列,时间序列数目等于Tags组数目。所以在Tags组数量确定的情况下,时间序列数也是确定的,只是随着Metric存入的增多,这个时间序列下的数据点会增加。

 以下图为例,介绍一下tsdb数据包和两个相关概念。

这个数据包的Metric是“Temprature”,表明是记录温度这个度量值的。

Tags里边包含三个Tag键名:Floor、Room、、和Device ID,图中给出的相应键值为33、3302和7649501,表明记录的是第33楼、3302房间设备id是7649501这个设备采集的温度值。

记录温度这个物理量的Value有一个,是数值型的摄氏度。

表中给出了标签为Floor=33、Room=3302、Device ID=7649501这个Metric的一个时间序列的温度数据,这个时间序列内包含5个数据点,也就是存入了5条温度记录,每条记录都有相应的Timestamp值和Value值。

四、阿里云物联网平台实例内TSDB功能介绍

1、数据写入

TSDB 支持通过 HTTP 协议和 TSDB Java Client 两种方式进行数据写入。下边介绍一下使用TSDB Java Client进行写入的实例。

(1)需要添加的依赖

implementation 'com.aliyun:hitsdb-client:0.2.7'

(2)写入数据代码

时间戳:1662794493715

要写入的数据:tb=3810

要写入的Metric:"TB"

要写入的tag:键名"deviceName",键值 "20210181"

注意:代码中的实例的connectString为tsdb数据库接入地址, port为端口号,username为用户名, password为登录密码。这些信息可从开发配置/时序存储配置查询。

//tsdb地址
String connectString="ts-2ze************07.hitsdb.rds.aliyuncs.com";
//端口号
String port=32**;
//用户名
String username="iotuser";
//密码
String password="************";final TSDBConfig config = TSDBConfig.address(connectString, port).basicAuth(username, password)// 网络连接池大小,默认为64。.httpConnectionPool(128)// HTTP 等待时间,单位为秒,默认为90秒。.httpConnectTimeout(90)// IO 线程数,默认为1。.ioThreadCount(1).config();
TSDB tsdbClient = TSDBClientFactory.connect(config);long timestamp = 1662794493715;
int tb=3810;Point point = Point.metric("TB").tag("deviceName", "20210181").timestamp(timestamp).value(tb).build();tsdbClient.put(point);

2、数据查询

TSDB 支持通过 HTTP 协议、TSDB Java Client两种方式进行数据的查询操作。

TSDB Java Client查询方式如下:

(1)需要添加的依赖

implementation 'com.aliyun:hitsdb-client:0.2.7'

(2)时间点查询

查询从现在开始过去最近时间点的一条数据

实现代码如下所示:

//tsdb地址
String connectString="ts-2ze************07.hitsdb.rds.aliyuncs.com";
//端口号
String port=32**;
//用户名
String username="iotuser";
//密码
String password="************";final TSDBConfig config = TSDBConfig.address(connectString, port).basicAuth(username, password)// 网络连接池大小,默认为64。.httpConnectionPool(128)// HTTP 等待时间,单位为秒,默认为90秒。.httpConnectTimeout(90)// IO 线程数,默认为1。.ioThreadCount(1).config();
TSDB tsdbClient = TSDBClientFactory.connect(config);
long now = System.currentTimeMillis();Map<String, String> tags = new HashMap<String, String>();
tags.put("deviceName","20210181");
String metric = "TB";LastPointQuery query = LastPointQuery.builder().timestamp(now).backScan(0).msResolution(true).sub(LastPointSubQuery.builder(metric, tags).build()).build();List<LastDataValue> lastDataValues = tsdbClient.queryLast(query);System.out.println(lastDataValues);

代码执行结果如下所示,其中tsuid是这条数据点的id号。

 [LastDPValue [metric=TB, timestamp=1662794691216, value=3810.0, tags={deviceName=20210181}, tsuid=0E00000000000F000002000000000010]]

(3)时间段查询

查询限定时间段内的所有数据

以下是实现代码,注意时间戳单位为毫秒

//tsdb地址
String connectString="ts-2ze************07.hitsdb.rds.aliyuncs.com";
//端口号
String port=32**;
//用户名
String username="iotuser";
//密码
String password="************";final TSDBConfig config = TSDBConfig.address(connectString, port).basicAuth(username, password)// 网络连接池大小,默认为64。.httpConnectionPool(128)// HTTP 等待时间,单位为秒,默认为90秒。.httpConnectTimeout(90)// IO 线程数,默认为1。.ioThreadCount(1).config();
TSDB tsdbClient = TSDBClientFactory.connect(config);
long now = System.currentTimeMillis();Query query = Query.timeRange(now - 24*3600 * 1000, now).sub(SubQuery.metric("TB").aggregator(Aggregator.NONE).tag("deviceName", "20210181").build()).build();
List<QueryResult> result = tsdbClient.query(query);System.out.println(result);

代码执行的结果如下所示,注意,因为是时间段查询,所以结果和时间点查询格式不一样。"dps"就是Data Point缩写的复数形式,其内容就是多个时间点的数据。

 [{"aggregateTags":[],"dps":{1662794395193:3810.0,1662794493715:3810.0,1662794591911:3810.0,1662794691216:3810.0},"metric":"TB","orderDps":[{"timestamp":1662794395193,"value":3810.0},{"timestamp":1662794493715,"value":3810.0},{"timestamp":1662794591911,"value":3810.0},{"timestamp":1662794691216,"value":3810.0}],"sdps":{},"tags":{"deviceName":"20210181"}}]

(4)时间戳与北京时间转换在线工具

因为TSDB存储要用到时间戳,时间戳和北京时间可以进行转换,本人经常用到的在线转换工具链接:时间戳(Unix timestamp)转换工具 - 在线工具 (tool.lu)

转换结果如图所示。

  3、数据管理

  • 数据时效设置

    可以通过控制台或者 API 设置数据的有效期。数据时效开启并设置完成后,系统对于定义的过期数据将立即标记失效,并在特定时间进行自动化清理。控制台设置时效如图所受。

  • 数据清理

    实例内tsdb可以通过 API 进行更灵活的数据清理。


http://chatgpt.dhexx.cn/article/cKiYZx44.shtml

相关文章

ES6—简介

目录 一、概述 二、扩展&#xff1a;Babel转码器 三、拓展&#xff1a;编译打包 一、概述 概念 ES6全称ECMAScript 6.0&#xff0c;是Javascript语言的下一代标准&#xff0c;2015年6月正式发布。 注意&#xff0c;ES6既是一个历史名词&#xff0c;也是一个泛指&#xff0c;…

深入浅出ES6(一):ES6是什么

深入浅出ES6&#xff08;一&#xff09;&#xff1a;ES6是什么 作者 Jason Orendorff &#xff0c;译者 刘振涛 发布于 2015年6月5日 | http://www.infoq.com/cn/articles/es6-in-depth-an-introduction 我的阅读清单 编者按&#xff1a;ECMAScript 6离我们越来越近了&#…

[ 前端开发 ] 为什么要学习ES6?

ECMAScript 6 概念 ECMAScript 6 简称 ES6 为什么要学习ES6? ES6 是 JavaScript 的下一个版本标准&#xff0c;诞生于2015年6月份。ES6 的主要目的是为了解决 ES5 的先天不足。ES6 的终极目标是为了使 JavaScript 语言可以用来编写复杂的大型应用程序&#xff0c;成为企业…

前端基础之ES6

ES6 ES6简介 ES6实际上是一个泛指&#xff0c;泛指ES2015及后续版本 为什么使用ES6&#xff1f; 每一次标准的诞生都意味着语言的完善&#xff0c;功能的加强。JavaScript语言本身也有一些令人不满意的地方。 变量提升特性增加了程序运行时的不可预测性语法过于松散&#x…

第一节:ES是什么?ES6是什么?

系列文章目录 第一节&#xff1a;ES是什么&#xff1f;ES6是什么&#xff1f; 文章目录 系列文章目录前言一、ES是什么&#xff1f;二、ES6是什么&#xff1f; 前言 学习一下ES&#xff0c;都是自己学习的总结和理解&#xff0c;大家有什么问题都可以提出&#xff0c;一起讨论…

1.什么是ES6,为什么使用它

1.什么是ES6&#xff1f; ECMAScript 6&#xff08;以下简称ES6&#xff09;是JavaScript语言的下一代标准&#xff0c;已经在2015年6月正式发布了。Mozilla公司将在这个标准的基础上&#xff0c;推出JavaScript 2.0。ES6主要是为了解决ES5的先天不足&#xff0c;比如JavaScri…

ES6是什么

ES6是什么 ECMAScript 6.0&#xff08;以下简称 ES6&#xff09;是 JavaScript 语言的下一代标准&#xff0c;已经在 2015 年 6 月正式发布了。 它的目标&#xff0c;是使得 JavaScript 语言可以用来编写复杂的大型应用程序&#xff0c;成为企业级开发语言。 现在大部分的编…

ES6是什么?通俗理解

1.了解一门语言&#xff0c;首先要搞明白它到底是什么&#xff1f; ECMA (Eurupean Compuler Manuluclurers Assuxiation)中文名为欧洲计算机制造商协会&#xff0c;这个组织的日常是评估、开发和认可电信和计算机标准。19919 年后该组织改名为ECMA国际。 ES6是门脚本语言&…

list集合转换成string字符串

集合转换成字符串 闲来无事&#xff0c;总结了几种list转换成string的方法 第一种 <jdk8新特性&#xff0c;string集合、integer集合均可随意转换成string> 个人觉得这个方法应该属于jdk8的新特性 ArrayList<String> arrayList new ArrayList<String>(){{…

python set转为list_python 怎么把set转成list

今天小就为大家分享一篇python-list,set间的转换实例&#xff0c;具有很好的参考价值&#xff0c;推荐手册&#xff1a;Python 基础入门教程 其实python中&#xff0c;set转list的非常的简单&#xff0c;直接将set的值放入list()的括号中即可&#xff0c;相反&#xff0c;list转…

Java list转set;JDK8 下list 集合转Set 集合

List 集合转Set 集合 1. List 集合和Set 集合的区别 在说如何List集合转Set 集合之前我们先回顾一下 List 集合和Set 集合的区别, 细致上说List 集合和Set 集合的区别还是有蛮多的有兴趣的同学可以去看一下源码&#xff0c;粗糙地讲List 集合和Set 集合的区别主要有那么几点 …

Java中的List与Set转换

一、List列表与Set列表的区别 List列表是有序、可以重复、线程不安全的列表,Set是无序、不能重复、线程不安全的列表。但List和Set可以通过方法来转换为线程安全的&#xff0c;加互斥锁。 Set<Long> setnew HashSet<>();// 转换为线程安全的集合Collections.sy…

BigDecimal中divide方法与setScale方法详解

BigDecimal中divide方法详解 1、首先说一下用法&#xff0c;BigDecimal中的divide主要就是用来做除法的运算。其中有这么一个方法. public BigDecimal divide(BigDecimal divisor,int scale, int roundingMode)第一个参数是除数&#xff0c;第二个参数代表保留几位小数&#x…

BigDecimal加减乘除及setScale的用法小结

Bigdecimal初始化&#xff1a; BigDecimal num new BigDecimal(2.225667);//这种写法不允许&#xff0c;会造成精度损失。 BigDecimal num new BigDecimal("2.225667");//一般都会这样写最好。 两种方式在下面会有实例比较。 一、setScale 1. ROUND_DOWN BigDecima…

2018年5-7月面试经历总结:阿里面试题

第一轮&#xff1a;电话初面 第二轮&#xff1a;技术面谈【技术职位尽量避免多谈管理上的工作】 第三轮&#xff1a;高管复试 第四轮&#xff1a;HR最后确认 一面&#xff1a;首先确认对阿里的意向度&#xff08;如果异地更会考虑对工作地点(杭州&#xff09;的意向度&#…

腾讯、阿里面试题 了解B+树吗?

腾讯、阿里面试题: 了解B树吗&#xff1f; 由于MySQL的索引结构是B树&#xff0c;所以B树是大厂的高频面试题,想理解B树&#xff0c;最好先理解B树&#xff0c;下面详细介绍B树、B树 B树 B树的概念 B树又称为B-树&#xff0c;是一种平衡多路查找树&#xff0c;描述B树&#x…

2021.3.10阿里面试题

获得第一行 n m ktempinput() templisttemp.split(" ") nint(templist[0]) mint(templist[1]) kint(templist[2])获得城市二维列表city[] for i in range(n):temp input()templist list(temp)if in templist: #找到起始位置&#xff0c;然后记录下标&…

阿里巴巴面试题- - -JVM篇(十四)

前言&#xff1a;七月末八月初的时候&#xff0c;秋招正式打响&#xff0c;公司会放出大量的全职和实习岗位。为了帮助秋招的小伙伴们&#xff0c;学长这里整理了一系列的秋招面试题给大家&#xff0c;所以小伙伴们不用太过焦虑&#xff0c;相信你们一定能超常发挥&#xff0c;…

总结一下软通外派阿里的面试题

前段时间&#xff0c;面了几家大外派到阿里的项目&#xff0c;所以和大家分享一下面试题 上来就是老套路 面试官&#xff1a;说下你们项目的流程 果咩&#xff1a; 巴拉巴拉。。。。 面试官&#xff1a;你们项目如何使用redis高可用的 果咩&#xff1a;可以使用哨兵模式和C…

阿里巴巴一面 :十道经典面试题解析

1. 用到分布式事务嘛?为什么用这种方案,有其他方案嘛? 什么是分布式事务 谈到事务&#xff0c;我们就会想到数据库事务&#xff0c;很容易就想到原子性、一致性、持久性、隔离性。 分布式事务跟数据库事务有点不一样&#xff0c;它是指事务的参与者、支持事务的服务器、资源…