【物联网】时序数据库InfluxDB解析及1.x版本与2.x版本区别详解

文章目录

一、什么是时序数据库?

时序数据库(Time-Series Database,TSDB)是一种专门为处理时间序列数据而设计的数据库。时间序列数据是指按时间顺序排列的数据,通常用于记录和查询系统、传感器、服务器等在一段时间内的运行状态。时序数据库具有以下特点:

  1. 数据模型简单:通常包含时间戳、度量值和可选的标签。
  2. 高效的写入性能:能够快速处理大量数据写入。
  3. 高效的查询性能:针对时间范围、聚合等操作进行优化。
  4. 数据压缩:通过数据压缩降低存储成本。

二、InfluxDB简介

InfluxDB是一款开源的时序数据库,适用于存储和分析大规模的时间序列数据。它具有以下优势:

  1. 易于安装和使用:InfluxDB安装简单,提供友好的HTTP API接口。
  2. 高性能:针对时序数据的写入和查询进行了优化。
  3. 可扩展性:支持集群部署,可根据需求扩展节点。
  4. 丰富的功能:支持数据保留策略、连续查询等。

三、InfluxDB 1.x版本与2.x版本区别

  1. 架构变化:InfluxDB 2.x版本在架构上进行了优化,将原先的多个组件(InfluxDB、InfluxDB OSS、InfluxDB Enterprise)整合为一个统一的InfluxDB 2.x版本。
  2. 数据模型:InfluxDB 2.x版本对数据模型进行了简化,将measurement、tag、field等概念统一为bucket。
  3. API升级:InfluxDB 2.x版本提供了全新的Flux查询语言,同时兼容InfluxQL。
  4. 安全性:InfluxDB 2.x版本加强了安全性,默认启用身份验证和授权。
  5. 可视化:InfluxDB 2.x版本内置了可视化工具,方便用户进行数据分析和展示。
  6. 集群管理:InfluxDB 2.x版本简化了集群管理,支持自动故障转移。

四、代码实现数据插入与查询

以下是基于InfluxDB 1.x版本和2.x版本的Java代码示例,实现数据插入与查询。

  1. InfluxDB 1.x版本
    (1)数据插入
java 复制代码
import org.influxdb.InfluxDB;
import org.influxdb.InfluxDBFactory;
import org.influxdb.dto.Point;
public class InfluxDB1xExample {
    public static void main(String[] args) {
        InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:8086", "username", "password");
        influxDB.setDatabase("mydb");
        Point point = Point.measurement("cpu_usage")
                .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS)
                .tag("region", "us-west")
                .addField("value", 0.64)
                .build();
        influxDB.write(point);
    }
}

(2)数据查询

java 复制代码
import org.influxdb.InfluxDB;
import org.influxdb.InfluxDBFactory;
import org.influxdb.dto.Query;
import org.influxdb.dto.QueryResult;
public class InfluxDB1xExample {
    public static void main(String[] args) {
        InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:8086", "username", "password");
        String query = "SELECT * FROM cpu_usage WHERE region='us-west' LIMIT 10";
        QueryResult results = influxDB.query(new Query(query, "mydb"));
        for (QueryResult.Result result : results.getResults()) {
            for (QueryResult.Series series : result.getSeries()) {
                System.out.println(series.toString());
            }
        }
    }
}
  1. InfluxDB 2.x版本
    (1)数据插入
java 复制代码
import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.InfluxDBClientFactory;
import com.influxdb.client.WriteApi;
import com.influxdb.client.domain.WritePrecision;
import com.influxdb.client.write.Point;
public class InfluxDB2xExample {
    public static void main(String[] args) {
        InfluxDBClient influxDBClient = InfluxDBClientFactory.create("http://localhost:8086", "mytoken".toCharArray());
        WriteApi writeApi = influxDBClient.getWriteApi();
        Point point = Point.measurement("cpu_usage")
                .addTag("region", "us-west")
                .addField("value", 0.64)
                .time(System.currentTimeMillis(), WritePrecision.MS);
        writeApi.writePoint(point);
        writeApi.close();
        influxDBClient.close();
    }
}

(2)数据查询

java 复制代码
import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.InfluxDBClientFactory
import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.InfluxDBClientFactory;
import com.influxdb.client.QueryApi;
import com.influxdb.client.domain.Dialect;
import com.influxdb.client.domain.Query;
import com.influxdb.client.domain.QueryParam;
public class InfluxDB2xExample {
    public static void main(String[] args) {
        InfluxDBClient influxDBClient = InfluxDBClientFactory.create("http://localhost:8086", "mytoken".toCharArray());
        QueryApi queryApi = influxDBClient.getQueryApi();
        String fluxQuery = "from(bucket: \"mybucket\") |> range(start: -1h) |> filter(fn: (r) => r._measurement == \"cpu_usage\" and r.region == \"us-west\") |> limit(n: 10)";
        Query query = new Query(fluxQuery, "myorg");
        queryApi.query(query, 20, new Consumer<FluxTable>() {
            @Override
            public void accept(FluxTable fluxTable) {
                fluxTable.getRecords().forEach(record -> {
                    System.out.println(record.getTime() + ": " + record.getValueByKey("_value"));
                });
            }
        });
        influxDBClient.close();
    }
}

在上面的代码示例中,我们首先创建了一个InfluxDBClient实例,这是InfluxDB 2.x版本提供的客户端库。然后,我们使用WriteApi来写入数据点,使用QueryApi来执行Flux查询语言编写的查询。

请注意,InfluxDB 2.x版本的API与1.x版本有很大的不同,特别是在查询语言方面。InfluxDB 2.x版本引入了Flux,这是一种更强大、更灵活的查询语言,用于处理和分析时序数据。

在2.x版本的查询示例中,我们使用了Flux查询来从特定的bucket中选择数据,并应用了一系列的操作,如range(选择时间范围)、filter(过滤数据)和limit(限制结果数量)。

最后,我们通过queryApi.query方法执行查询,并使用一个Consumer来处理查询结果。在这个例子中,我们简单地打印出每个记录的时间戳和值。

总结来说,InfluxDB 2.x版本在API和功能上都有显著的改进,提供了更现代的编程模型和更丰富的查询能力。开发者在选择使用哪个版本时,需要根据自己的项目需求和兼容性考虑。

相关推荐
_李小白1 分钟前
【OSG学习笔记】Day 41: ReadFileCallback 与 WriteFileCallback(自定义文件读取)
java·笔记·学习
每天吃饭的羊3 分钟前
nest,java对比
java·开发语言
组合缺一3 分钟前
SolonCode CLI v2026.4.11 发布(中文驱动的编码智能体)
java·ai编程·agents·solon-ai·claudecode·opencode·soloncode
努力努力再努力wz5 分钟前
【C++高阶系列】外存查找的极致艺术:数据库偏爱的B+树底层架构剖析与C++完整实现!(附B+树实现的源码)
linux·运维·服务器·数据结构·数据库·c++·b树
大佐不会说日语~5 分钟前
Spring AI Alibaba 的 Function Calling 使用 @Tool 调用中,无法获取用户ID踩坑记录
java·人工智能·spring boot·spring·alibaba·function
知识分享小能手7 分钟前
MongoDB入门学习教程,从入门到精通,MongoDB 持久性完全指南(20)
数据库·学习·mongodb
Java基基7 分钟前
Maven 4要来了:15年后,Java构建工具迎来“彻底重构”
java·开发语言·重构
zhanghongbin019 分钟前
Remote Write:高效数据推送
java·人工智能
何中应10 分钟前
Doris部署&连接
大数据·数据库·时序数据库·doris
云边有个稻草人11 分钟前
KES 表空间目录自动创建特性:简化存储管理、提升运维效率
数据库·国产数据库·kes