[时序数据库]:InfluxDB进阶

文章目录

  • 1 摘要
  • 2 背景
    • 2.1 问题一:针对Influx V2.0工具
    • 2.2 问题二:针对Influx查询语言
  • 3 需求分析
  • 4 快速入门
    • 4.1 客户端驱动版本选择
    • 4.2 连接influx
      • 4.2.1 influx配置信息
      • 4.2.2 influx连接配置
      • 4.2.3 测试连通情况
  • 5 Influx工具类
    • 5.1 InfluxQL工具类
      • 5.1.1 出现背景
      • 5.1.2 InfluxQL工具类
    • 5.2 插入数据工具类

1 摘要

摘要:InfluxQL;InfluxQL工具类;influxdb.java客户端

2 背景

2.1 问题一:针对Influx V2.0工具

针对新版Influx V2.0 版本数据库:

  • 其一,influx支持两种查询语言,flux和InfluxQL,然后InfluxQL在高版本中已没有得到较好维护,因而,在后续开发中,笔者采用Influx V1.x 版本来进行开发。

2.2 问题二:针对Influx查询语言

针对使用新版Influx数据库,目前在其上做操做有两种方法,

  • 其一,使用官方的UI工具,缺点:由于是可视化拼购操作,对操作有所限制。
  • 其二,使用flux语言,flux是一种查询语言,其语法格式类似于R语言,具有管道符这些的形式,其也是官方所推荐的,然而由于没太使用过,此处不做展开,如有兴趣自己查询。
  • 最后,也就是笔者所推荐的,InfluxQL其语法格式,高度切合于SQL语言,因而作为influx快速使用所推荐。

3 需求分析

正如,上述所描述问题,此处选择环境:

  • 版本:influx v1.x
  • 查询实现语言:InfluxQL

4 快速入门

4.1 客户端驱动版本选择

        <!--influxDB--><dependency><groupId>org.influxdb</groupId><artifactId>influxdb-java</artifactId><version>2.19</version></dependency>

4.2 连接influx

4.2.1 influx配置信息

示例如下,可以优化:

spring:influxdb:url: yourURLdatabaseApply: databaseName1databaseTemp: databaseName2

4.2.2 influx连接配置

/*** influx配置读取*/
@Data
@Component
@ConfigurationProperties(prefix = "spring.influxdb")
public class InfluxProperties {private String url; //influx访问URL
//    private String user; //用户名
//    private String password; //密码private String databaseApply; //应用数据库private String databaseTemp; //备份用数据库public InfluxDB getConnectionDatabaseApply() {return InfluxDBFactory.connect(url).setDatabase(databaseApply);}public InfluxDB getConnectionDatabaseTemp() {return InfluxDBFactory.connect(url).setDatabase(databaseTemp);}
}

4.2.3 测试连通情况

    @Testpublic void testInfluxQLWithMoreTerm() {InfluxDB influxDB = influxProperties.getConnectionDatabaseTemp();System.out.println("influxDB.ping() = " + influxDB.ping());}
}

5 Influx工具类

5.1 InfluxQL工具类

5.1.1 出现背景

目前针对InfluxQL暂无诸如mybatis样的,持久层框架,因而此处提供一种工具类的解决方案。
核心思想:InfluxQL高度类似于SQL,因而我们把诸如select、group等着关键字,封装成工具类方法,以实现链式InfluxQL,便于后续开发于维护。

5.1.2 InfluxQL工具类

/*** InfluxQL构造器** @author jx* @date 2023/7/23 21:24*/public class InfluxQLQuery {private final StringBuilder queryBuilder;private String database;private InfluxQLQuery(String query) {this.queryBuilder = new StringBuilder(query);}public static InfluxQLQuery select(String... fields) {StringJoiner joiner = new StringJoiner(", ");for (String field : fields) {if (!field.isEmpty()) {joiner.add(field);}}return new InfluxQLQuery("SELECT " + joiner);}//    SELECT max("A_Cond_Temp"), min("A_Feed_Pump_Power_Cons_Rate") FROM "JJjTEStljx" GROUP BY "A_Cond_Temp", "A_Feed_Pump_Power_Cons_Rate"public InfluxQLQuery select(List<AggregationType> aggregationTypes, String... fields) {//得到类型List<String> list = new ArrayList<>();for (AggregationType aggregationType : aggregationTypes) {list.add(aggregationType +"(\""+ fields +"\"");}return new InfluxQLQuery("SELECT " + list);}public InfluxQLQuery from(String measurement) {queryBuilder.append(" FROM ").append(measurement);return this;}public InfluxQLQuery where(String condition) {queryBuilder.append(" WHERE ").append(condition);return this;}public InfluxQLQuery groupBy(String grouping) {queryBuilder.append(" GROUP BY ").append(grouping);return this;}/*** 设置查询时,时间戳为上海时间** @return 上海时区*/public InfluxQLQuery setShanghaiTimeZone() {queryBuilder.append(" tz('Asia/Shanghai') ");return this;}public QueryResult execute(InfluxDB influxDB, String database) {Query queryObject = new Query(queryBuilder.toString(), database);return influxDB.query(queryObject);}public InfluxQLQuery selectMean(String field) {queryBuilder.append("MEAN(").append(field).append(")");return this;}public InfluxQLQuery selectMin(String field) {queryBuilder.append("min(").append(field).append(")");return this;}public InfluxQLQuery selectMax(String field) {queryBuilder.append("max(").append(field).append(")");return this;}public InfluxQLQuery selectSum(String field) {queryBuilder.append(" sum(").append(field).append(")");return this;}public InfluxQLQuery selectCount(String field) {queryBuilder.append(" count(").append(field).append(")");return this;}/*** 查询结果的最大数量** @param limit* @return*/public InfluxQLQuery limit(int limit) {queryBuilder.append(" LIMIT ").append(limit);return this;}/*** 设置当前操作的值。** @param interval* @return*/public InfluxQLQuery interval(String interval) {queryBuilder.append(" INTERVAL ").append(interval);return this;}/*** 设置查询条件中的标签。** @param tags* @return*/public InfluxQLQuery whereTags(Map<String, String> tags) {StringBuilder tagsBuilder = new StringBuilder();for (Map.Entry<String, String> entry : tags.entrySet()) {String tagKey = entry.getKey();String tagValue = entry.getValue();tagsBuilder.append(" \"").append(tagKey).append("\"='").append(tagValue).append("' AND");}// 删除最后的 ANDif (tagsBuilder.length() > 0) {tagsBuilder.setLength(tagsBuilder.length() - 4);}queryBuilder.append(" WHERE").append(tagsBuilder);return this;}/*** 设置填充策略。** @param value* @return*/public InfluxQLQuery fill(String value) {queryBuilder.append(" fill(").append(value).append(")");return this;}/*** 查询结果的排序方式。** @param field* @param direction* @return*/public InfluxQLQuery orderBy(String field, String direction) {queryBuilder.append(" ORDER BY ").append(field).append(" ").append(direction);return this;}/*** 设置结果集的返回数量上限。** @param limit* @return*/public InfluxQLQuery sLimit(int limit) {queryBuilder.append(" SLIMIT ").append(limit);return this;}/*** 设置结果集的偏移量。** @param offset* @return*/public InfluxQLQuery sOffset(int offset) {queryBuilder.append(" SOFFSET ").append(offset);return this;}/*** 指定写入的目标measurement** @param targetMeasurement* @return*/public InfluxQLQuery into(String targetMeasurement) {queryBuilder.append(" INTO ").append(targetMeasurement);return this;}/*** 指定写入数据时的标签** @param tagKey* @param tagValue* @return*/public InfluxQLQuery withTag(String tagKey, String tagValue) {queryBuilder.append(" WITH ").append(tagKey).append("=").append(tagValue);return this;}/*** 创建数据保留策略** @param policyName* @param duration* @param replication* @param isDefault* @return*/public InfluxQLQuery createRetentionPolicy(String policyName, String duration, String replication,boolean isDefault) {queryBuilder.append(" CREATE RETENTION POLICY ").append("\"").append(policyName).append("\"").append(" ON ").append(database).append(" DURATION ").append(duration).append(" REPLICATION ").append(replication);if (isDefault) {queryBuilder.append(" DEFAULT");}return this;}/*** 展示当前数据库的所有保留策略。** @return*/public InfluxQLQuery showRetentionPolicies() {queryBuilder.append(" SHOW RETENTION POLICIES").append(" ON ").append(database);return this;}/*** 删除指定的数据保留策略。** @param policyName* @return*/public InfluxQLQuery dropRetentionPolicy(String policyName) {queryBuilder.append(" DROP RETENTION POLICY ").append("\"").append(policyName).append("\"").append(" ON ").append(database);return this;}/*** 创建用户** @param username* @param password* @return*/public InfluxQLQuery createUser(String username, String password) {queryBuilder.append(" CREATE USER ").append("\"").append(username).append("\"").append(" WITH PASSWORD ").append("'").append(password).append("'");return this;}/*** 设置用户密码** @param username* @param password* @return*/public InfluxQLQuery setUserPassword(String username, String password) {queryBuilder.append(" SET PASSWORD FOR ").append("\"").append(username).append("\"").append(" = ").append("'").append(password).append("'");return this;}/*** 设置当前操作的数据库。** @param database* @return*/public InfluxQLQuery setDatabase(String database) {this.database = database;return this;}/*** 设置当前操作的measurement。** @param measurement* @return*/public InfluxQLQuery setMeasurement(String measurement) {queryBuilder.append(" ").append(measurement);return this;}/*** 设置当前操作的字段。** @param field* @return*/public InfluxQLQuery setField(String field) {queryBuilder.append(" ").append(field);return this;}/*** 设置当前操作的值。** @param value* @return*/public InfluxQLQuery setValue(String value) {queryBuilder.append(" = ").append(value);return this;}public InfluxQLQuery aggFunction(InfluxQLQuery influxQLQuery, TimeType timeType, String field) {if (influxQLQuery == null || timeType == null || field == null) {return null;}switch (timeType) {case MAX:influxQLQuery.selectMax(field);break;case AVG:influxQLQuery.selectMean(field);break;case MIN:influxQLQuery.selectMin(field);break;case SUM:influxQLQuery.selectSum(field);break;default:return null;}return influxQLQuery;}public static InfluxQLQuery groupBy(String... fields) {StringJoiner joiner = new StringJoiner(", ");for (String field : fields) {if (!field.isEmpty()) {joiner.add(field);}}return new InfluxQLQuery("SELECT " + joiner);}
}

5.2 插入数据工具类

注意:此处相关逻辑,需要依据入库实际需求而适应!

 @Resourceprivate InfluxProperties influxProperties;/*** 插入influx应用数据库** @param assetId    表名* @param pointId    测点名* @param pointValue 测点值* @param time       消息时间戳*/public void intoInfluxApply(String assetId, String pointId, Double pointValue, Long time) {InfluxDB influxDBApply = influxProperties.getConnectionDatabaseApply();//创建要写入的数据点Map<String, Object> fields = new HashMap<>();fields.put(pointId, pointValue); //测单标识符,值// 写入数据Point point = Point.measurement(assetId)//表名.time(time, TimeUnit.MILLISECONDS)//时间戳.fields(fields)//添加一个字段的多个属性值.build();influxDBApply.write(influxProperties.getDatabaseApply(), "autogen", point);}/*** 插入influx备份数据库** @param assetId    表名* @param pointId    测点名* @param pointValue 测点值* @param time       消息时间戳*/public void intoInfluxTemp(String assetId, String pointId, Double pointValue, Long time) {InfluxDB influxDBApply = influxProperties.getConnectionDatabaseTemp();//创建要写入的数据点Map<String, Object> fields = new HashMap<>();fields.put(pointId, pointValue); //测单标识符,值// 写入数据Point point = Point.measurement(assetId)//表名.time(time, TimeUnit.MILLISECONDS)//时间戳.fields(fields)//添加一个字段的多个属性值.build();try {influxDBApply.write(influxProperties.getDatabaseTemp(), "autogen", point);} catch (Exception e) {log.info("{}", "写入influx临时数据库出现错误" + e.getMessage());}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/51109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端进阶Html+css10----定位的参照对象(高频面试题)

1.relative的参照对象 1&#xff09;元素按照标准流进行排布&#xff1b; 2&#xff09;定位参照对象是元素自己原来的位置&#xff0c;可以通过left、right、top、bottom来进行位置调整&#xff1b; 2.absolute&#xff08;子绝父相&#xff09; 1&#xff09;元素脱离标准流…

校园跑腿小程序开发方案详解

校园跑腿小程序App的功能有哪些&#xff1f; 1、用户注册与登录 用户可以通过手机号、社交账号等方式进行注册和登录&#xff0c;以便使用跑腿服务。 2、下单与发布任务 用户可以发布各类跑腿任务&#xff0c;包括食品外卖、快递代收、文件送达、帮我买、帮我取、帮我送等等…

【Java转Go】快速上手学习笔记(五)之Gorm篇

目录 go get命令1、go get命令无响应问题2、Unresolved dependency错误 连接数据库连接.gomain.go 操作数据库创建表新增数据更新数据删除数据查询数据单表查询多表查询 用到的数据库表原生SQL 完整代码 go往期文章笔记&#xff1a; 【Java转Go】快速上手学习笔记&#xff08;…

C语言:运算符优先级

一、优先级&#xff08;常使用的运算符&#xff09; 见表格 二、注意 总体原则&#xff1a;算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符 同一级别下的运算符的运算次序由表达式的结合方向决定 运算符注释级别( )圆括号1[ ]数组下标1后置后置2后置--后置--2前置…

获取标签元素在整个页面(包含滚动条)中的相对位置的方法

1、获取网页元素的相对位置的普通方法 有了绝对位置以后&#xff0c;获得相对位置就很容易了&#xff0c;只要将绝对坐标减去页面的滚动条滚动的距离就可以了。滚动条滚动的垂直距离&#xff0c;是document对象的scrollTop属性&#xff1b;滚动条滚动的水平距离是document对象…

【ag-grid-vue】基本使用

ag-grid是一款功能和性能强大外观漂亮的表格插件&#xff0c;ag-grid几乎能满足你对数据表格所有需求。固定列、拖动列大小和位置、多表头、自定义排序等等各种常用又必不可少功能。关于收费的问题&#xff0c;绝大部分应用用免费的社区版就够了&#xff0c;ag-grid-community社…

MATLAB打开excel读取写入操作例程

本文使用素材含代码测试用例等 MATLAB读写excel文件历程含&#xff0c;内含有测试代码资源-CSDN文库 打开文件 使用uigetfile函数过滤非xlsx文件&#xff0c;找到需要读取的文件&#xff0c;首先判断文件是否存在&#xff0c;如果文件不存在&#xff0c;程序直接返回&#x…

线上问诊:业务数据采集

系列文章目录 线上问诊&#xff1a;业务数据采集 文章目录 系列文章目录前言一、环境准备1.Hadoop2.Zookeeper3.Kafka4.Flume5.Mysql6.Maxwell 二、业务数据采集1.数据模拟2.采集通道 总结 前言 暑假躺了两个月&#xff0c;也没咋写博客&#xff0c;准备在开学前再做个项目找…

elementui表格嵌套上传文件直传到oss服务器(表单上传)

提示&#xff1a;记录项目中遇到的问题&#xff0c;仅供参考 文章目录 前言一、vue代码二、js接口请求代码 前言 项目需求是在表格中嵌套一个上传图片的功能&#xff0c;并且回显选择的图片和已上传的图片&#xff0c;再通过点击操作列中上传按钮才开始上传&#xff0c;使用的…

如遭遇DDoS等攻击会对企业和个人造成严重影响,包括以下

1. 服务不可用&#xff1a;正常用户无法访问目标服务器&#xff0c;导致业务中断&#xff0c;影响用户体验。 2. 数据泄露&#xff1a;攻击者可能会在攻击过程中窃取用户数据&#xff0c;导致隐私泄露和财产损失。 3. 经济损失&#xff1a;由于服务中断&#xff0c;企业可能遭受…

放大电路【笔记】

直接耦合 电路之间信号的传递叫耦合&#xff0c;输入和输出都是通过放大电路直接连接&#xff0c;没经过滤波等手段的处理 先有直流的部分&#xff1a;直流的Ube有直流的Ib&#xff0c;直流的Ib有直流的Ic&#xff0c;直流的Ic有直流的Uce。 再有交流的部分&#xff0c;交流的…

C语言刷题训练DAY.12

1.统计成绩 解题思路&#xff1a; 这里我们设置两个变量记录最大值和最小值&#xff0c;再用一个sum统计分数总和即可。 解题代码&#xff1a; #include<stdio.h> int main() {int n 0;scanf("%d", &n);double arr[100] { 0 };int i 0;//最高分double …

postgresql 数据排序

postgresql 常见操作 排序总结 排序 -- 排序的时候null是最大的值(看一下) select employee_id,manager_id from employeesorder by manager_id desc;-- nulls first使null值排在第一位 select employee_id,manager_id from employeesorder by manager_id nulls first;-- null…

财务数据分析用什么软件好?财务数据分析的几个重要数据是什么?

财务的数据分析也分很多种的&#xff0c;就拿最粗略的划分来说&#xff0c;也可以分为3大领域—— 财务数据处理类工具财务数据挖掘类工具财务数据可视化工具 01 数据处理类 在财务数据处理这一块儿&#xff0c;不用说&#xff0c;当然是以excel为主力的数据处理类工具—— …

Protobuf在IDEA中的插件安装教程

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

python 基础篇 day 4 选择结构—— if 结构

文章目录 if 基础结构单 if 语句if-else 语句if-elif-else 语句嵌套的 if 语句 if 进阶用法使用比较运算符使用逻辑运算符使用 in 关键字range() 函数使用 is 关键字使用 pass 语句 三目运算符语法例子注意补充举例注意 if 基础结构 单 if 语句 if 条件: 执行条件为真时的代码…

海思Hi3861L开发三-新建自定义项目

一、简介 上一篇文章,介绍了如何下载安装SDK,并且编译和下载。但都是基于SDK原生提供的demo。那本节我们就来介绍一下,如果创建一个自己的项目。 二、新建目录结构 先看SDK提供的目录结构,如下图: 因为是基于应用的开发,所以我们只关注app这个文件夹。可以看到…

【vue2】前端实现下载后端返回的application/octet-stream文件流

1、下载csv/txt时 此时无须修改接口的响应格式 let filenameRegex /filename[^;\n]*((["]).*?\2|[^;\n]*)/; let matches filenameRegex.exec(data.headers[content-disposition]); let blob new Blob([\uFEFF data.data], {//目前只有csv格式type: text/csv;charse…

纠缠辅助的量子网络:原理、技术、发展与挑战

7月11日&#xff0c;中国科大网络空间安全学院和陆军院士工作室李忠辉博士为第一作者、薛开平教授为通讯作者的量子网络综述论文“Entanglement-Assisted Quantum Networks: Mechanics, Enabling Technologies, Challenges, and Research Directions”在通信领域知名期刊《IEEE…

Ext JS 之Microloader(微加载器)

“Microloader”是 Sencha 数据驱动的 JavaScript 和 CSS 动态加载器的名称。 清单 app.json 用于应用的设置,Sencha Cmd 在构建的时候会读取这个文件。 Sencha Cmd 转换“app.json”的内容并将生成的清单传递给 Microloader 以在运行时使用。 最后,Ext JS 本身也会查阅运…