当前位置: 首页 > news >正文

[时序数据库]: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());}}

相关文章:

[时序数据库]:InfluxDB进阶

文章目录 1 摘要2 背景2.1 问题一&#xff1a;针对Influx V2.0工具2.2 问题二&#xff1a;针对Influx查询语言 3 需求分析4 快速入门4.1 客户端驱动版本选择4.2 连接influx4.2.1 influx配置信息4.2.2 influx连接配置4.2.3 测试连通情况 5 Influx工具类5.1 InfluxQL工具类5.1.1 …...

uniapp编写微信小程序遇到的坑总结

1、阻止事件冒泡 使用uniapp开发微信小程序的时候&#xff0c;发现使用click.stop来阻止事件冒泡没有作用&#xff0c;点击了之后发现仍然会触发父组件或者祖先组件的事件。 在网上查阅&#xff0c;发现使用tap.stop才能阻止事件冒泡。 2、二维码生成 在网上找了很多&…...

Binary operator ‘*‘ cannot be applied to two ‘Double?‘ operands

在 swift 中声明 Double 类型参数变量在进行运算处理时抛出了如下异常 Binary operator * cannot be applied to two Double? operands 情况一 参数类型不匹配,需将参数类型进行匹配 self.max height / (length * width) // 初始 self.max height / (length * Double(wid…...

C#如何打包EXE程序生成setup安装文件

项目结束之后&#xff0c;有需要将winForm程序打包成.exe文件提供给用户。 这里记录一下打包过程。 1&#xff1a;首先获取打包插件&#xff0c;如果你的VS已经安装&#xff0c;忽略此步骤。 点击 工具->扩展和更新&#xff0c;选择联机&#xff0c;搜索installer&#x…...

【python实现向日葵控制软件功能】手机远程控制电脑

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人_python人工智能视觉&#xff08;opencv&#xff09;从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了&#xff1a; https://blog.csdn.net/lbcy…...

手机系统录屏怎么录?有什么其他录制方法和注意事项?

手机系统录屏是一种很方便的方式&#xff0c;可以用于录制游戏、教程视频&#xff0c;或者是跟别人分享一些操作。在不同的手机系统中&#xff0c;录制方法可能会有所不同&#xff0c;以下是一些通用的步骤分享以及其他录制工具的分享&#xff0c;有需要的小伙伴们快来看一看吧…...

记录一个编译TubeTK时的报错:at_check问题

在使用如下命令安装TubeTK的cuda_nms时&#xff0c;报了一个错误&#xff0c;记录一下这个错误和解决办法 (base) redmeryredmery:~/Desktop/MOT/TubeTK/post_processing/nms$ python setup.py build_ext --inplace因为这个命令是在/home/redmery/Desktop/MOT/TubeTK/install/…...

k8s v1.27.4二进制部署记录

记录二进制部署过程 #!/bin/bash#升级内核 update_kernel() {rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.orgyum -y install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpmyum --disablerepo"*" --enablerepo"elrepo-kernel&q…...

C# API 文档注释规范

C# API 文档注释规范 1. 命名空间注释(namespace)2. summary3. remarks and para4. param5. returns6. example and code7. exception8. typeparam 最近在开发工作中需要实现 API 帮助文档&#xff0c;如果根据所写的代码直接重写 API 帮助文档将会是意见非常大的工作量&#x…...

分类预测 | Matlab实现基于TSOA-CNN-GRU-Attention的数据分类预测

分类预测 | Matlab实现基于TSOA-CNN-GRU-Attention的数据分类预测 目录 分类预测 | Matlab实现基于TSOA-CNN-GRU-Attention的数据分类预测效果一览基本介绍研究内容程序设计参考资料 效果一览 基本介绍 Matlab实现分类预测 | Matlab实现基于TSOA-CNN-GRU-Attention的数据分类预…...

《深度剖析K8s》学习笔记

一、容器技术 1.从进程说起 a. 概述 进程&#xff1a;数据和状态的综合 容器技术的核心&#xff1a;约束和修改进程的动态表现&#xff0c;创造出边界&#xff08;Cgroup&#xff1a;约束/namespace&#xff1a;进程视图&#xff09; 启动容器例子&#xff1a; docker ru…...

神经网络基础-神经网络补充概念-49-adam优化算法

概念 Adam&#xff08;Adaptive Moment Estimation&#xff09;是一种优化算法&#xff0c;结合了动量梯度下降法和RMSProp的优点&#xff0c;用于在训练神经网络等深度学习模型时自适应地调整学习率。Adam算法在深度学习中广泛应用&#xff0c;通常能够加速收敛并提高模型性能…...

Java:正则表达式书写规则及相关案例:检验QQ号码,校验手机号码,邮箱格式,当前时间

正则表达式 目标:体验一下使用正则表达式来校验数据格式的合法性。需求:校验QQ号码是否正确&#xff0c;要求全部是数字&#xff0c;长度是(6-20&#xff09;之间&#xff0c;不能以0开头 首先用自己编写的程序判断QQ号码是否正确 public static void main(String[] args) {Sy…...

图数据库_Neo4j_Centos7.9安装Neo4j社区版3.5.4_基于jdk1.8---Neo4j图数据库工作笔记0011

首先上传安装包,到opt/soft目录 然后看一下jdk安装的是什么版本的,因为在neo4j 4以后就必须要用jdk11 以上的版本,我这里还用着jdk1.8 所以 我这里用3.5.4的版本 关于下载地址: https://dist.neo4j.org/neo4j-community-3.5.4-unix.tar.gz 然后再去解压到/opt/module目录下 …...

使用Rust编写的一款使用遗传算法、神经网络、WASM技术的模拟生物进化的程序

模拟生物进化程序 Github地址&#xff1a;FishLife 期待各位的star✨✨✨ 本项目是一个模拟生物进化的程序&#xff0c;利用遗传算法、神经网络技术对鱼的眼睛和大脑进行模拟。该项目是使用 Rust 语言编写的&#xff0c;并编译为 WebAssembly (Wasm) 格式&#xff0c;使其可以…...

UE4/UE5 “无法双击打开.uproject 点击无反应“解决

一、方法一&#xff1a;运行UnrealVersionSelector.exe 1.找到Epic Game Lancher的安装目录&#xff0c; 在lancher->Engine->Binaries->Win64->UnrealVersionSelector.exe 2.把UnrealVersionSelector.exe 分别拷贝到UE4 不同版本引擎的 Engine->Binaries->…...

【前端】深入理解CSS定位

目录 一、前言二、定位组成1、定位模式1.1、静态定位static①、语法定义②、特点 1.2、相对定位relative①、语法定义②、特点③、代码示例 1.3、绝对定位absolute①、语法定义②、特点③、代码示例1&#xff09;、没有祖先元素或者祖先元素没有定位2&#xff09;、祖先元素有定…...

【问题】分布式事务的场景下如何保证读写分离的数据一致性

我的理解这个题目可以获得以下关键字&#xff1a;分布式处理、读写分离、数据一致性 那么就从”读写分离“做切入口吧&#xff0c;按我的理解其实就是在保证数据一致性的前提下两个&#xff08;或以上&#xff09;的数据库分别肩负不同的数据处理任务。太过久远的就不说了&…...

常见的Web安全漏洞有哪些,Web安全漏洞常用测试方法介绍

Web安全漏洞是指在Web应用程序中存在的可能被攻击者利用的漏洞&#xff0c;正确认识和了解这些漏洞对于Web应用程序的开发和测试至关重要。 一、常见的Web安全漏洞类型&#xff1a; 1、跨站脚本攻击(Cross-Site Scripting&#xff0c;XSS)&#xff1a;攻击者通过向Web页面注入…...

随机微分方程

应用随机过程|第7章 随机微分方程 见知乎&#xff1a;https://zhuanlan.zhihu.com/p/348366892?utm_sourceqq&utm_mediumsocial&utm_oi1315073218793488384...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...