Influxdb是一个开源的分布式时序、时间和指标数据库。
它有三大特性:
- 时序性(Time Series):与时间相关的函数的灵活使用(诸如最大、最小、求和等);
- 度量(Metrics):对实时大量数据进行计算;
- 事件(Event):支持任意的事件数据,换句话说,任意事件的数据我们都可以做操作。
同时,它有以下几大特点:
- schemaless(无结构),可以是任意数量的列;
- min, max, sum, count, mean, median 一系列函数,方便统计;
- Native HTTP API, 内置http支持,使用http读写;
- Powerful Query Language 类似sql;
- Built-in Explorer 自带管理工具。
influxdb相关名词
- database:数据库;
- measurement:数据库中的表;
- points:表里面的一行数据。
influxDB中独有的一些概念,Point由时间戳(time)、数据(field)和标签(tags)组成。
- time:每条数据记录的时间,也是数据库自动生成的主索引;
- fields:各种记录的值;
- tags:各种有索引的属性。
下面从sql语句和java API两方面介绍influxdb的基本操作
1.sql查询方式
安装好influxdb后,键入influx进入influxdb命令行控制台。help查看帮助,可以看到有以下命令可以查看influx的database,measurement,tag,field等。
数据库操作
- 创建数据库
create database test
- 删除数据库
drop database test
- 使用某个数据库
use test
表操作
- 新建表
InfluxDB中没有显式的新建表的语句,只能通过insert数据的方式来建立新表。其中 table_test就是表名,name是索引,value=xx是记录值,记录值可以有多个,最后是指定的时间,也可以不指定时间,默认设置当前时间。
insert table_test,name=zhangsan value=55i 1225362186366662
此时已经自动创建table_test measurement表
- 删除表
drop measurement table_test
- series操作
series表示这个表里面的数据,可以在图表上画成几条线,series主要通过tags排列组合算出来。
show series from table_test
- 插入数据
插入数据同新建表命令,第一次插入,如果不存在表则自动创建,否则写入已有数据表,InfluxDB没有提供修改和删除数据的方法。但是删除可以通过InfluxDB的数据保存策略(Retention Policies)来实现,详见。
2.java API方式
以maven工程为例,引入influxDB maven依赖,非maven工程可下载相应jar包导入工程即可。
<dependency>
<groupId>org.influxdb</groupId>
<artifactId>influxdb-java</artifactId>
<version>2.9</version>
</dependency>
- 连接influxdb
其中,url指influxdb的url地址格式为: http://<host>:8086, USER为用户名,PASSWORD为密码,默认都为admin
InfluxDB influxDB = InfluxDBFactory.connect(URL, USER, PASSWORD);
- 写入数据
Builder builder = Point.measurement("table_test")
.tag("tag1", "www").tag("tag2", "22")
.tag("tag3", "man");
Point point = builder .addField("value1", 66).addField("value2", 22).build();
influxDB.write(INFLUXDB_DBNAME, "autogen", point );
- 查询数据
String sql = "select * from result";
Query query = new Query(sql, INFLUXDB_DBNAME);
QueryResult result = influxDB.query(query);
if (result.getResults().get(0).getSeries() != null) {
List<String> columns = result.getResults().get(0).getSeries().get(0).getColumns();
List<Object> resval = result.getResults().get(0).getSeries().get(0).getValues().get(0);
double qpsdata = (Double) resval.get(columns.indexOf("value1"));
System.out.println(qpsdata);
}
参考资料