项目中需要存放大量设备日志,且需要对其进行简单的数据分析,信息提取工作.

结合众多考量因素,项目决定使用时序数据库中的领头羊InfluxDB.

引入依赖

项目中使用influxdb-java,在pom文件中添加如下依赖(github地址:https://github.com/influxdata/influxdb-java):

org.influxdb

influxdb-java

2.15

application.yaml文件配置如下所示(请按照实际情况填写):

spring:

influx:

url: *

password: admin

user: 123

database: log_management

配置

(1) 创建配置类

@Configuration

public class InfluxDbConfig {

@Value("${spring.influx.url:''}")

private String influxDBUrl;

@Value("${spring.influx.user:''}")

private String userName;

@Value("${spring.influx.password:''}")

private String password;

@Value("${spring.influx.database:''}")

private String database;

@Bean

public InfluxDbUtils influxDbUtils() {

return new InfluxDbUtils(userName, password, influxDBUrl, database, "");

}

}

@Data

public class InfluxDbUtils {

private String userName;

private String password;

private String url;

public String database;

private String retentionPolicy;

// InfluxDB实例

private InfluxDB influxDB;

// 数据保存策略

public static String policyNamePix = "logRetentionPolicy_";

public InfluxDbUtils(String userName, String password, String url, String database,

String retentionPolicy) {

this.userName = userName;

this.password = password;

this.url = url;

this.database = database;

this.retentionPolicy = retentionPolicy == null || "".equals(retentionPolicy) ? "autogen" : retentionPolicy;

this.influxDB = influxDbBuild();

}

/**

* 连接数据库 ,若不存在则创建

*

* @return influxDb实例

*/

private InfluxDB influxDbBuild() {

if (influxDB == null) {

influxDB = InfluxDBFactory.connect(url, userName, password);

}

try {

createDB(database);

influxDB.setDatabase(database);

} catch (Exception e) {

log.error("create influx db failed, error: {}", e.getMessage());

} finally {

influxDB.setRetentionPolicy(retentionPolicy);

}

influxDB.setLogLevel(InfluxDB.LogLevel.BASIC);

return influxDB;

}

}

构建实体类

InfluxDB中,measurement对应于传统关系型数据库中的table(database为配置文件中的log_management).

InfluxDB里存储的数据称为时间序列数据,时序数据有零个或多个数据点.

数据点包括time(一个时间戳),measurement(例如logInfo),零个或多个tag,其对应于level,module,device_id),至少一个field(即日志内容,msg=something error).

InfluxDB会根据tag数值建立时间序列(因此tag数值不能选取诸如UUID作为特征值,易导致时间序列过多,导致InfluxDB崩溃),并建立相应索引,以便优化诸如查询速度.

@Builder

@Data

@Measurement(name = "logInfo")

public class LogInfo {

// Column中的name为measurement中的列名

// 此外,需要注意InfluxDB中时间戳均是以UTC时保存,在保存以及提取过程中需要注意时区转换

@Column(name = "time")

private String time;

// 注解中添加tag = true,表示当前字段内容为tag内容

@Column(name = "module", tag = true)

private String module;

@Column(name = "level", tag = true)

private String level;

@Column(name = "device_id", tag = true)

private String deviceId;

@Column(name = "msg")

private String msg;

}

保存数据

以下代码为单条日志保存,influxdb-java亦支持批量保存(因为与InfluxDB通讯均是通过http,因此建议批量保存以减少性能损耗).

LogInfo logInfo = LogInfo.builder()

.level(jsonObject.getString("level"))

.module(module)

.deviceId(deviceId)

.msg(jsonObject.getString("msg"))

.build();

Point point = Point.measurementByPOJO(logInfo.getClass())

.addFieldsFromPOJO(logInfo)

.time(jsonObject.getLong("time"), TimeUnit.MILLISECONDS)

.build();

// 出于业务考量,设备可以设置不同的保存策略(策略名为固定前缀+设备ID)

influxDB.write(influxDBUtils.database, InfluxDbUtils.policyNamePix + deviceId, point);

查询数据

因为代码与业务耦合比较厉害,因此此处仅截选做概要示范.

// InfluxDB支持分页查询,因此可以设置分页查询条件

String pageQuery = " LIMIT " + request.getPageSize() + " OFFSET " + ((request.getPageNum() - 1) * request.getPageSize());

// 此处查询所有内容,如果

String queryCmd = "SELECT * FROM "

// 查询指定设备下的日志信息

// 要指定从 RetentionPolicyName(保存策略前缀+设备ID).measurement(logInfo) 中查询指定数据)

+ InfluxDbUtils.policyNamePix + request.getDeviceId() + "." + "logInfo"

// 添加查询条件(注意查询条件选择tag值,选择field数值会严重拖慢查询速度)

+ queryCondition

// 查询结果需要按照时间排序

+ " ORDER BY time DESC"

// 添加分页查询条件

+ pageQuery;

选择时序数据库,不建议使用删除以及更新操作,因此不做介绍.

可以通过创建或者RetentionPolicy,来添加或者更新数据的删除时间.

PS:

如果您觉得我的文章对您有帮助,可以扫码领取下红包或扫码支持(随意多少,一分钱都是爱),谢谢!

支付宝红包

支付宝

微信

influxdb java spring_Spring boot使用influxDB总结相关推荐

  1. influxdb java api使用_java使用influxDB数据库的详细源码

    此文实例给亲们分享了java使用influxDB数据库的具体代码,供大家参考,具体内容如下 1.pom.xml中导入jar包依赖 org.influxdb influxdb-java 2.5 2.编写 ...

  2. InfluxDB Java入门

    添加依赖 <dependency><groupId>org.influxdb</groupId><artifactId>influxdb-java< ...

  3. influxdb无法查询tag_DolphinDB与InfluxDB对比测试报告

    DolphinDB是一款分析型的分布式时序数据库(time-series database),内置处理流式数据处理引擎,具有内置的并行和分布式计算的功能,并提供分布式文件系统,支持集群扩展.Dolph ...

  4. 【直播回顾】云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第19讲):Java Spring Cloud微服务架构模式与开发实战...

    主讲人:徐雷(云栖社区特邀Java专家) 徐雷,花名:徐雷frank:资深架构师,MongoDB中文社区联席主席,吉林大学计算机学士,上海交通大学硕士.从事了 10年+开发工作,专注于分布式架构,Ja ...

  5. Java Spring Boot VS .NetCore (七) 配置文件

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  6. Java Spring Boot 2.0 实战之制作Docker镜像并推送到Docker Hub和阿里云仓库

    内容摘要:大规模集群快速部署Java应用,需要制作Docker镜像,本次课程详细介绍如何制作Java程序的Docker镜像文件,深入解析DockerFile核心参数,以及实践演练把我们制作的Docke ...

  7. 4_InfluxDB学习之InfluxDB的基本概念、InfluxDB中独有的概念(Point,series),InfluxDB学习之InfluxDB的基本操作,InfluxDB操作方式,crud

    4.InfluxDB学习之InfluxDB的基本概念 4.1.与传统数据库中的名词做比较 4.2.InfluxDB中独有的概念 4.2.1.Point 4.2.2.series 4.3.InfluxD ...

  8. influxdb基础(二)——influxdb基本概念 (database、measurement、fields、tags) + 简单实操 (简单insert、select)

    文章目录 前言 基本概念 基本语法 influxdb类比mysql语法 measurement的特殊性 influxdb独有语法 简单实战演练 insert语法太多的坑 select简单查询 time ...

  9. influxdb基础(三)——influxdb按时间分片存储数据(shard和shard group)

    文章目录 前言 shard分片 Cache缓存 Wal存储预写日志 Tsm file真正持久化存储数据 Compactor 合并压缩线程 shard group 分片逻辑分组 shard durati ...

最新文章

  1. 【搜索专题】BFS中的多源BFS-双端队列BFS
  2. Mac下的比较器工具DeltaWalker的试用期延长法
  3. Echarts富文本rich及格式化工具formatter的使用
  4. AVL Insertion(浙大pta)
  5. MySQL workbench创建用户与授权
  6. oracle11g临时表,oracle11G的临时表空间
  7. Visual C# 2005——超好用的DropDown与DropDownClosed事件
  8. Android 准确过滤(禁止) Emoji表情
  9. 2006年100款最佳安全工具谱
  10. 域名注册之后如何操作
  11. Android全面解析之Window机制
  12. vue项目中element-ui的分页器(组件封装)
  13. linux检查网络是否通畅_linux下怎么检测网络的连通性
  14. 播放assets文件里视频文件的问题
  15. 想转行做程序员?转行不难,难的是以后不后悔。
  16. 如何让网站HTTPS评级为A或者A+
  17. 金融相关时间序列分析全指南
  18. 港科夜闻|香港科大(广州)与深圳湾实验室签署重要战略合作协议,共同促进粤港澳大湾区产业升级、社会发展与科技进步...
  19. 深入理解Java中的i++、++i语句
  20. 【更新】数据库解决方案Data Abstract 9发布丨附下载

热门文章

  1. 目前最好用的大规模强化学习算法训练库是什么?
  2. 机器学习Tips:关于Scikit-Learn的 10 个小秘密
  3. Python异步通信模块asynchat
  4. 将前500页,和中间500页的CVE编号放在一起
  5. maven的setting.xml文件配置信息【仅仅更改了一处】
  6. E1载波的数据速率是(16)Mb/s,E3载波的数据速率是(17)Mb/s。答案】B D
  7. JSP第二次作业_5小题
  8. Java Web项目配置环境搭建-如何增加Tomcat服务 Tomcat[内含Tomcat7资源]
  9. 特征选择-处理缺失值-处理不平衡的数据-处理异常值-分档-编码-特征缩放
  10. 链表问题2——在双链表中删除倒数第K个节点