InfluxDB数据库基本使用及相关踩坑记录

InfluxDB简介

关于influxdb,我在这边做一个简要的介绍:
InfluxDB是一个由InfluxData开发的开源时序型数据。它由Go写成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。
可以简单的记为它是一个时序型的数据库,不同于mysql这种关系型数据库,它可以根据具体情况实时的通过代码来添加自己所需的列,并且查询和存储速度极快.
在我开发之前做的测试中,我们在一台linux系统上部署了influxdb,然后模拟了100台设备,每个设备上有3台机器进行每秒1次的数据发送到influxdb进行存储,进行了一个星期左右的测试,influxdb表现相当优秀,没有出现任何数据库崩溃的情况.

InfluxDB相关信息

拿平常用的最多的mysql进行比较吧

mysqltablecolumn
influxdbmeasurementpoint (tag、field、times)

可以看到influxdb跟mysql还是相当不同的,influxdb中所有列的存储格式大概都是一个key value的形式,key就相当于列名,value就是具体的值
tag 相当于mysql的索引,是单独的列,也只有它带索引 只支持字符串类型!
field 自定义的列,都不带索引
times 唯一主键,自动根据时间生成,生成的时区是美区
influxdb不需要像传统数据库一样创建各种表,其表的创建主要是通过第一次数据插入时自动创建.
在mysql中数据的存储,只要你没有主动进行删除,数据是会一直存在的,但influxdb不同,在influxdb中你可以设定influxdb的存储策略-retention policy
这个存储策略就代表了数据在数据库中可以保留多久,通常初始为autogen(永久保留)

springboot整合InfluxDB

先导入固定的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,后面有空时会再找一下相关资料.

InfluxDB在java中的使用

这里就不过多赘述了,直接给大家上一个网站
github-influxdb在java中的使用
这个文档能满足你的基本操作.

踩坑记录

1.influxdb时区问题

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值