关于influxdb,我在这边做一个简要的介绍:
InfluxDB是一个由InfluxData开发的开源时序型数据。它由Go写成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。
可以简单的记为它是一个时序型的数据库,不同于mysql这种关系型数据库,它可以根据具体情况实时的通过代码来添加自己所需的列,并且查询和存储速度极快.
在我开发之前做的测试中,我们在一台linux系统上部署了influxdb,然后模拟了100台设备,每个设备上有3台机器进行每秒1次的数据发送到influxdb进行存储,进行了一个星期左右的测试,influxdb表现相当优秀,没有出现任何数据库崩溃的情况.
拿平常用的最多的mysql进行比较吧
表 | 列 | |
---|---|---|
mysql | table | column |
influxdb | measurement | point (tag、field、times) |
可以看到influxdb跟mysql还是相当不同的,influxdb中所有列的存储格式大概都是一个key value的形式,key就相当于列名,value就是具体的值
tag 相当于mysql的索引,是单独的列,也只有它带索引 只支持字符串类型!
field 自定义的列,都不带索引
times 唯一主键,自动根据时间生成,生成的时区是美区
influxdb不需要像传统数据库一样创建各种表,其表的创建主要是通过第一次数据插入时自动创建.
在mysql中数据的存储,只要你没有主动进行删除,数据是会一直存在的,但influxdb不同,在influxdb中你可以设定influxdb的存储策略-retention policy
这个存储策略就代表了数据在数据库中可以保留多久,通常初始为autogen(永久保留)
先导入固定的maven依赖
<dependency>
<groupId>org.influxdb</groupId>
<artifactId>influxdb-java</artifactId>
<version>2.15</version>
</dependency>
相关配置可以写在配置文件中
influx:
url: http://localhost:8086
password: demo
user: demo
database: test
然后就需要再springboot中初始化influxdb对象,目前我是写了一个springboot启动时,自动初始化的流程,但只能生成influxdb对象,不能让它自动初始化我想要的数据库,这点暂时还没有办法解决,希望有知道的大佬能告知下,下面把代码贴出来:
@Configuration
public class InfluxDBConfig {
@Value("${spring.influx.user}")
private String userName;
@Value("${spring.influx.password}")
private String password;
@Value("${spring.influx.url}")
private String url;
@Value("${spring.influx.database}")
private String database;
@Bean
public InfluxDbUtils influxDbUtils() {
return new InfluxDbUtils(userName, password, url, database, InfluxDbUtils.POLICY_NAME_PIX);
}
}
@Data
@Slf4j
public class InfluxDbUtils {
private String userName;
private String password;
private String url;
public String database;
private String retentionPolicy;
// InfluxDB实例
private InfluxDB influxDB;
// 数据保存策略
public static final String POLICY_NAME_PIX = "autogen";
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) ? POLICY_NAME_PIX : retentionPolicy;
this.influxDB = influxDbBuild();
}
/**
* 连接数据库 ,若不存在则创建
*
* @return influxDb实例
*/
private InfluxDB influxDbBuild() {
if (influxDB == null) {
influxDB = InfluxDBFactory.connect(url, userName, password);
}
try {
influxDB.setDatabase(database);
} catch (Exception e) {
log.info(e.getMessage());
} finally {
influxDB.setRetentionPolicy(retentionPolicy);
}
influxDB.setLogLevel(InfluxDB.LogLevel.BASIC);
return influxDB;
}
}
整个代码的一个大体的流程就是通过@configuration和@Bean注解,让springboot启动时,把influxdbUtils对象交由spring管理.有需要使用到influxdb对象的地方,就通过@autowired注入进去使用,但还是有个问题,就是我在非mvc三层的地方使用@autowired注入后是null,网上找了一下出现这个的原因可能是类在bean加载之前被调用,或者springboot在加载时没有识别到此类,但第二个原因是肯定可以排除的,因为其它的都可以识别到,所以推断是被其它类调用,解决方法并没有采用网上说的通过@PostConstruct来初始化,因为不止这一个地方用到了,但这个只初始化一次,所以用了getBean()通过反射来获取到对象,这样就解决了这个问题,但还是比较费解为啥不能@autowired,后面有空时会再找一下相关资料.
这里就不过多赘述了,直接给大家上一个网站
github-influxdb在java中的使用
这个文档能满足你的基本操作.