4.InfluxDB Java API使用

引入依赖

<dependency>
    <groupId>com.influxdb</groupId>
    <artifactId>influxdb-client-java</artifactId>
    <version>6.7.0</version>
    <exclusions>
        <exclusion>
            <artifactId>okhttp</artifactId>
            <groupId>com.squareup.okhttp3</groupId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <artifactId>okhttp</artifactId>
    <groupId>com.squareup.okhttp3</groupId>
    <version>4.10.0</version>
</dependency>

InfluxDB的API本质上就是通过HTTP请求到InfluxDB进行操作,所以他的API根据不同的功能分成了不同API类型 具体需要操作某一种资源 选择具体API即可

image-20221215151242044

常用的API

  • WriteApiBlocking 同步写入API WriteApi 异步写入API
  • DeleteApi 删除API
  • QueryApi 同步查询API InfluxQLQueryApi SQL查询API
public class InfluxApiTest {

    final static String token = "DMq0mfKS2-Qy9_cr8bmKdPcX-oA-R55WmOZ8VDQP0SuUoKb1bOPZZa2auS5oYr8u8KiupXol_R2Km3TeJ7IAXA==";

    final static String bucket = "java_api_bucket";

    final static String org = "corn";

    final static String url = "http://192.168.198.129:8086";

    static InfluxDBClient client;

    @BeforeAll
    public static void initClient() {
        client = InfluxDBClientFactory.create(url, token.toCharArray(), org, bucket);
    }

    @AfterAll
    public static void closeClient() {
        client.close();
    }

    /**
     * 同步写入API WriteApiBlocking
     * client.getWriteApiBlocking()
     */
    @Test
    public void testInsertData() {
        WriteApiBlocking writeApiBlocking = client.getWriteApiBlocking();
        // 1. 通过Influx 行协议的方法写入 writeRecord
        // 选择时间戳模式
        writeApiBlocking.writeRecord(WritePrecision.MS, "temperature,city=bj value=34.2");

        // 2. 通过写入 Point点API
        Point point = Point.measurement("temperature")
                .addTag("city", "sh")
                .addField("value", 32.12);
        writeApiBlocking.writePoint(point);

        // 3. POJO的模式写入
        Temperature temperature = new Temperature();
        temperature.setCity("sc");
        temperature.setValue(40.1);
        writeApiBlocking.writeMeasurement(WritePrecision.MS, temperature);
    }

    /**
     * 异步写入API
     * 1. 默认INFLUX 在将请求存放在缓冲区 每1s(可调整) 或者 每批次数据大于1000条(可调整) 才会一次性发送给Influx Server
     * 2. 调用flush会在强制发送缓冲区的请求
     * 3. 调用close会强制发送缓冲区数据
     * 4. 其他写入API 与同步写 一样 可以使用 行协议 Point 或者 POJO
     */
    @Test
    public void testAysnInserData() {
        WriteOptions options = WriteOptions.builder()
                // 每批次500条
                .batchSize(500)
                // 每2s 刷写一次
                .flushInterval(2000)
                .build();
        WriteApi writeApi = client.makeWriteApi(options);

        Temperature temperature = new Temperature();
        temperature.setCity("hk");
        temperature.setValue(23.1);
        writeApi.writeMeasurement(WritePrecision.MS, temperature);

        writeApi.flush();

    }

    /**
     * 删除某一时间窗口指定的数据
     */
    @Test
    public void testDelete() {

        /**
         *  只能通过tag进行操作
         *  "tag1=\"value1\" and (tag2=\"value2\" and tag3!=\"value3\")"
         *
         */
        String predictSql = "city=\"hk\"";
        DeleteApi deleteApi = client.getDeleteApi();
        deleteApi.delete(OffsetDateTime.now().minusHours(12),
                OffsetDateTime.now(),
                predictSql,
                bucket,
                org
        );
    }

    @Test
    public void testQuery(){
        QueryApi queryApi = client.getQueryApi();
        String queryFlux =
                "from(bucket: \"java_api_bucket\")\n" +
                "  |> range(start: -12h)\n" +
                "  |> filter(fn: (r) => r[\"_measurement\"] == \"temperature\")\n" +
                "  |> filter(fn: (r) => r[\"_field\"] == \"value\")\n" +
                "  |> filter(fn: (r) => r[\"city\"] == \"sh\")\n" +
                "  |> aggregateWindow(every: 5s, fn: mean, createEmpty: false)\n" +
                "  |> yield(name: \"mean\")";
        List<Temperature> list = queryApi.query(queryFlux, Temperature.class);
        Assertions.assertNotNull(list);
    }


    /**
     * SQL的方式查询
     */
    @Test
    public void testQueryBySQL(){
        InfluxQLQueryApi sqlApi = client.getInfluxQLQueryApi();
        String sql = "SELECT value FROM temperature WHERE city = 'sh'";
        List<Temperature> target = new ArrayList<>();
        InfluxQLQuery query = new InfluxQLQuery(sql,bucket);
        InfluxQLQueryResult result = sqlApi.query(query, (columnName, rawValue, resultIndex, seriesName) -> {
            Temperature temperature = new Temperature();
            if(columnName.equals("value")){
                temperature.setValue(Double.valueOf(rawValue));
                target.add(temperature);
            }
            return temperature;
        });
        result.getResults().forEach(r->{
            r.getSeries().forEach(s->{
                System.out.println(s.getColumns());
            });
        });
        System.out.println("===========================================");
        target.forEach(System.out::println);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值