influxdb java spring_Spring boot使用influxDB总结

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

结合众多考量因素,项目决定使用时序数据库中的领头羊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:

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

支付宝红包

支付宝

微信

20190624115953301531.png

20190624115953592558.png

20190624115953744907.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值