InfluxDB 是一款专为时序数据设计的数据库,特别适用于处理带有时间戳的连续数据,例如服务器监控指标、物联网传感器数据、日志统计、金融行情等。与传统关系型数据库(如 MySQL)不同,InfluxDB 针对高频写入、大规模数据压缩、时间范围查询和聚合分析进行了专门优化,能够高效支持“最近一小时 CPU 使用率”、“过去7天平均接口耗时”这类典型时序查询场景。
一、安装influxdb
influxdb的安装方法参考官网:安装 InfluxDB OSS v2
以本地安装为例,安装完成并成功启动后可访问 http://localhost:8086/ 可进行influxdb数据库初始配置,包括登录账号密码、初始存储桶名称、组织名称。配置完成后进入初始界面:
二、SpringBoot框架内使用influxdb
1、引入influxdb依赖
influxdb-client用于读写数据
<!-- influxDb-->
<dependency>
<groupId>com.influxdb</groupId>
<artifactId>influxdb-client-java</artifactId>
<version>6.6.0</version>
</dependency>
2、通过配置类初始化influxdb client
首先需要在application.yml配置中增加 InfluxDB 的核心连接参数:
influxDb:
url: http://127.0.0.1:8086
token: your token
org: your group
bucket: your bucket name
然后增加InfluxdbClient配置类:
@Configuration
@Data
public class InfluxDBConfig {
@Value("${influxDb.url}")
public String url;
@Value("${influxDb.token}")
public String token;
@Value("${influxDb.org}")
public String org;
@Value("${influxDb.bucket}")
public String bucket;
@Bean
public InfluxDBClient influxDBClient() {
return InfluxDBClientFactory.create(
url,
token.toCharArray(),
org,
bucket
);
}
}
InfluxDBClientFactory是创建 InfluxDB 客户端实例的工厂,调用InfluxDBClientFactory.create()创建。如需使用influxdb客户端,只需要注入influxDBClient即可。
InfluxDBClientOptions用于配置 InfluxDB 连接,如设置超时时间等参数,以OkHttpClient为例,该参数是设置用于与 InfluxDB 通信的 HTTP 客户端:
// 设置超时时间,防止过长时间的查询
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.callTimeout(30, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS);
InfluxDBClientOptions build = InfluxDBClientOptions.builder()
.okHttpClient(builder)
.url(url)
.authenticateToken(token.toCharArray())
.org(org)
.bucket(bucket)
.build();
return InfluxDBClientFactory.create(build);
InfluxDBClientFactory.create()更多的使用方法可参考api文档
3、存入数据
以下是使用influxDB存入数据的示例:
@Autowired
private InfluxDBClient influxDBClient;
public void test(){
try (WriteApi writeApi = influxDBClient.makeWriteApi()) {
Point point = Point.measurement("temperature")
.addTag("location", "west")
.addField("value", 55D)
.time(Instant.now().toEpochMilli(), WritePrecision.MS);
writeApi.writePoint(point);
}
}
三、InfluxDB的数据存储
1、存储桶bucket
存储桶类似于MySQL中的 database,它是 database 和保留策略的集合。
访问 http://localhost:8086/ ,可以通过前端界面创建存储桶,创建时需要设置存储桶名称和数据过期时间:
2、fields
fields 由 field key 和 field value 组成。field key 都是字符串,他们存储数据信息。以下是influxdb数据库中的一条原始数据,_field 列代表 field key ,说明该数据表示值;_value列代表 field value ,记录了数据的具体值,它可以是字符串、浮点数、整数、布尔值,但同一个 field key 存储的 field value 应保持类型相同。
field是InfluxDB数据结构所必需的一部分——在InfluxDB中不能没有field。同时需要注意的是,field是没有索引的,因此将 field value 作为过滤条件来查询效率会很低:
SELECT * FROM "test" WHERE "value" = 1
3、tags
tag 由 tag key 和 tag value 组成。tag key 和 tag value 都作为字符串存储。此处location代表 tag key ,west代表 tag value 。
tag不是必需的字段,但是因为tag具有索引,对tag的查询更快,因此tag常用于存储常用的元数据。
4、measurement
measurement作为tag,fields和time列的容器,measurement的名字是存储在相关fields数据的描述。 measurement的名字是字符串,对于一些SQL用户,measurement在概念上类似于表。
5、时间戳_time
每条数据都会有一个时间戳,如果不指定时间,则默认使用当前时间: