influxdb2 使用

依赖

        <dependency>
            <groupId>com.influxdb</groupId>
            <artifactId>influxdb-client-java</artifactId>
            <version>6.9.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-csv</artifactId>
            <version>1.10.0</version>
        </dependency>

配置

package io.geekidea.boot.config;

import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.InfluxDBClientFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = "influx2")
public class InfluxConfig {
    private String url;
    private String token;
    private String org;
    private String bucket;

    @Bean
    public InfluxDBClient influxDBClient(){
        return InfluxDBClientFactory.create(url, token.toCharArray(),org,bucket);
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public void setToken(String token) {
        this.token = token;
    }

    public void setOrg(String org) {
        this.org = org;
    }

    public void setBucket(String bucket) {
        this.bucket = bucket;
    }
}

yaml配置

influx2:
  url: http://localhost:8086
  org: aaaa
  token: x8bpTR_-7cUt36-uSIDXTL0-plF6qOto8nHpPcHxTL6rglRzg1OxS4LKAawKJKhtvs1PS6eJL7XRh90i2yzeWw==
  # loaddata web-ui 上可以查询
  bucket: aaaa

influxql 查询数据, 行协议写入数据代码

package io.geekidea.boot.rador.service.influxdb;

import com.influxdb.client.*;
import com.influxdb.client.domain.InfluxQLQuery;
import com.influxdb.client.domain.WritePrecision;
import com.influxdb.query.FluxRecord;
import com.influxdb.query.FluxTable;
import com.influxdb.query.InfluxQLQueryResult;
import com.mysql.cj.QueryResult;
import com.mysql.cj.xdevapi.InsertParams;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.*;

@Service
public class InfluxdbHandler {

    @Autowired
    private InfluxDBClient dbclient;

    /**
     *
     * 数据结构参考 radar,x=3,y=4 longitude=1,latitude=2,deformation=3,strength=5 时间
     * 实际生产环境不能操作100万个点
     */
    public void writLineProtacal(ArrayList<double[]> doubleList) {

        doubleList = new ArrayList<>(); // 存储到数据库的结构  每行有6个点
        //  经度 纬度 x y deformation形变 strength强度
        testdataCreate(doubleList);

        try(WriteApi writeApi = dbclient.makeWriteApi()) {

            StringBuilder buf = new StringBuilder();
            Long current = System.currentTimeMillis() ;
            String linesplit = "\n";

            long nanos = System. currentTimeMillis()   * 1_000_000 ;  // 和北京时间对齐

            for (double[] doubles : doubleList) {

                buf.append(String.format("radar x=%f,y=%f,lon=%f,lat=%f,defor=%f,stren=%f "
                        ,doubles[2], doubles[3],doubles[0],doubles[1],doubles[4],doubles[5] ) )
                        .append(nanos).append(linesplit);
                nanos = nanos + 1;
            }
            long starttime = System.currentTimeMillis();
            // System.out.println(buf);
            // 以纳秒写入
            writeApi.writeRecord(WritePrecision.NS,buf.toString());
            long endtime = System.currentTimeMillis();
            System.out.println("写入耗时:" + (endtime - starttime) );
            //System.out.println(buf.toString());
        }
    }


    /**
     * 产生测试数据生产关闭
     * @param doubleList
     */
    private static void testdataCreate(ArrayList<double[]> doubleList) {
        Random random = new Random();
        for (int i = 0; i < 400000; i++) {
            double[] array = new double[6];

            for (int j = 0; j < 6; j++) {
                if(j == 2 ){
                    array[j] = i ;
                } else if(j == 3 ){
                    array[j] = i+1 ;
                }else{
                    array[j] = random.nextDouble();
                }
            }

            doubleList.add(array);
        }

        // 打印数据列表
        /*for (double[] array : doubleList) {
            for (double value : array) {
                System.out.print(value + " ");
            }
            System.out.println();
        }*/
    }


    /**
     * 计算 形变 ,速度 和加速度
     * @param starttime
     * @param endtime
     * @param x
     * @param y
     */
    public void calculateDefor(long starttime ,long endtime ,float x ,float y ){

        //
        // Query data
        //
        String influxQL = " SELECT time,defor,lat,lon, stren, x, y FROM \"radar\" WHERE time >= now() - 3d AND x = 999959 AND y = 999960  ";


        String deforSql = "";
        String speedSql = "";

        // String.format("%d", longValue);  String.format("%.6f" 浮点  6位小数



        InfluxQLQueryApi queryApi = dbclient.getInfluxQLQueryApi();
        // send request
        InfluxQLQueryResult result = queryApi.query(new InfluxQLQuery(influxQL, "aaaa").setPrecision(InfluxQLQuery.InfluxQLPrecision.SECONDS),
              (columnName, rawValue, resultIndex, seriesName) -> {
                  // convert columns
                  switch (columnName) {
                      case "time":
                          return Instant.ofEpochSecond(Long.parseLong(rawValue));
                      case "defor":
                          return  Double.parseDouble(rawValue) ;
                      case "lat":
                          return  Double.parseDouble(rawValue) ;
                      case "lon":
                          return  Double.parseDouble(rawValue) ;
                      case "stren":
                          return  Double.parseDouble(rawValue) ;
                      case "x":
                          return  Double.parseDouble(rawValue) ;
                      case "y":
                          return  Double.parseDouble(rawValue) ;
                      default:
                          throw new IllegalArgumentException("unexpected column " + columnName);
                  }
              });

        // 生产可以注释
        for (InfluxQLQueryResult.Result resultResult : result.getResults()) {
          for (InfluxQLQueryResult.Series series : resultResult.getSeries()) {
              for (InfluxQLQueryResult.Series.Record record : series.getValues()) {
                  System.out.println(record.getValueByKey("time") + ": " + record.getValueByKey("defor") + ": " + record.getValueByKey("lat") + ": " + record.getValueByKey("lon") + ": " + record.getValueByKey("stren") + ": " + record.getValueByKey("x") + ": " + record.getValueByKey("y")  );
              }
          }
        }
    }



}

查询非常慢30秒单机版,最终弃用 改为其他时序数据库,flux 按列查询,不如influxql好用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值