一、需要了解的概念
1、时序数据
时序数据是以时间为维度的一组数据。如温度随着时间变化趋势图,CPU随着时间的使用占比图等等。通常使用曲线图、柱状图等形式去展现时序数据,也就是我们常常听到的“数据可视化”。
2、时序数据库
非关系型数据库,以时间作为数据主键,专门用来存储时序数据。
3、时序数据库特点
(1)、时序数据库能存储海量数据。数据特点就是冷热差别明显,一般近期产生的数据为热数据,产生时间较远的数据为冷数据,冷数据被压缩放到磁盘里去来节省空间。
(2)、写入性能极优,时序数据库通常都是采用LSM Tree 的变种,顺序写磁盘来增强数据的写入能力。通常,关系型数据库采用 B+树数据结构,在数据写入时,有可能会触发叶裂变,从而产生了对磁盘的随机读写,降低写入速度。
(3)、低延时、高并发查询:通过索引降低查询延时,通过缓存等技术提高数据并发能力。
(4)、数据只写不改。
4、InfluxDB
是一种时序数据库,通常被用在监控场景,比如运维和 IOT(物联网)领域。这类数据库旨在存储时序数据处理数据用于数据展示分析,和通过监控预警策略达到响应的服务预警等。
5、InfluxDB的相关概念说明
(1)、Bucket–相当于mysql的database–数据库概念
(2)、Measurement—相当于mysql的table–数据表概念
(3)、Point–相当于数据表的一行。
Point包含:tag(数据标签,非必须)、field(不带索引)、timestemp(唯一主键)
(3.1)、tag–数据的标签-类似mysql的索引
(3.2)、field–数据的值保存
(3.3)、time-数据采集时间,数据唯一标识,一个表内不可重复,重复会覆盖
二、docker部署influxDB
1、拉取镜像
docker pull influxdb
2、启动容器
docker run -d -p 8086:8086 --name influxdb influxdb:latest
3、打开浏览器,可以正常打开
http://192.168.249.88:8086/
4、首次访问需要配置账号密码组织等信息
userName:admin // 登录账户
password:12345678 // 密码
org:zw // 组织
bucket:fruit // 数据桶
下图为配置界面,具体本人配置如上面的文字描述,下面的界面仅第一次会出现,之后就没有,所以无法截图了。
5、再次登录
三、springboot集成
官方提供了很多语言的集成方式,这里我们以java为例,其他语言,可以在下图位置查看
具体步骤:
1、引入pom
<!-- influxdb --><dependency><groupId>com.influxdb</groupId><artifactId>influxdb-client-java</artifactId><version>3.1.0</version></dependency>
2、添加配置(application.properties)
influxdb.url=http://192.168.249.88:8086
influxdb.bucket=fruit
influxdb.org=zw
influxdb.token=0jgapBVZ6GWMWpE77XYuPi_GLhWksvqEfNraocXMchivz5XvcLM_50tWLpXskTKFWQbUCoD_bS-iYFOjWvHzrg==
3、配置类,读取配置注入容器,不用导出应用配置
根据前缀读取配置,注入容器,以后就不用导出用@value引了,可以直接引入配置类
importlombok.Data;importorg.springframework.boot.context.properties.ConfigurationProperties;@Data@ConfigurationProperties(prefix ="influxdb")publicclassInfluxdbProperties{privateString url;privateString bucket;privateString org;privateString token;}
4、influxDB数据库客户端InfluxDBClient实例化和注入spring容器
初始化client连接和注入容器
importcom.influxdb.client.InfluxDBClient;importcom.influxdb.client.InfluxDBClientFactory;importorg.springframework.boot.context.properties.EnableConfigurationProperties;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;@Configuration@EnableConfigurationProperties(InfluxdbProperties.class)publicclassInfluxdbConfig{@BeanpublicInfluxDBClientinitInfluxDBClient(InfluxdbProperties properties){InfluxDBClient client =InfluxDBClientFactory.create(properties.getUrl(),properties.getToken().toCharArray(),properties.getOrg(),properties.getBucket());return client;}}
5、封装InfluxDB工具类–封装新增和查询的方法
本例仅简单封装了一下,还有很多批量操作等其他接口,可以自己在点进去看下如何调用。
importcom.alibaba.fastjson.JSON;importcom.influxdb.client.InfluxDBClient;importcom.influxdb.client.QueryApi;importcom.influxdb.client.WriteApiBlocking;importcom.influxdb.client.domain.WritePrecision;importcom.influxdb.client.write.Point;importcom.influxdb.query.FluxRecord;importcom.influxdb.query.FluxTable;importcom.zw.study.influxdb.entity.Orange;importorg.springframework.beans.factory.DisposableBean;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importjava.util.List;@ServicepublicclassInfluxdbServiceimplementsDisposableBean{@AutowiredprivateInfluxDBClient client;@AutowiredprivateInfluxdbProperties properties;// 新增1,字符串形式,格式:String data = "zw_pear,host=host1 value=1111.11";publicvoidwriteLine(String data){WriteApiBlocking writeApi = client.getWriteApiBlocking();
writeApi.writeRecord(properties.getBucket(), properties.getOrg(),WritePrecision.NS, data);}// 新增2,Point形式publicvoidwritePoint(Point point){WriteApiBlocking writeApi = client.getWriteApiBlocking();
writeApi.writePoint(properties.getBucket(), properties.getOrg(), point);}// 新增3,自定义pojo形式publicvoidwritePojo(Orange orange){WriteApiBlocking writeApi = client.getWriteApiBlocking();
writeApi.writeMeasurement(WritePrecision.NS, orange);}@Overridepublicvoiddestroy()throwsException{
client.close();}public<M>List<M>queryList(){// 查询fruit库中过去1小时的数据String query ="from(bucket: \"fruit\") |> range(start: -1h)";QueryApi queryApi = client.getQueryApi();List<FluxTable> tables = queryApi.query(query, properties.getOrg());for(FluxTable table : tables){for(FluxRecord record : table.getRecords()){System.out.println(JSON.toJSONString(record));}}// 查询fruit库中zw_orange表中过去12小时数据,最多取10条,封装到pojo中String query1 ="from(bucket: \"fruit\")\n"+" |> range(start: -12h, stop: now())\n"+" |> filter(fn: (r) => r._measurement == \"zw_orange\" and r._field == \"value\")\n"+" |> limit(n:10)";List<Orange> table2 = queryApi.query(query1,Orange.class);System.out.println("table2:"+JSON.toJSONString(table2));returnnull;}}
6、测试和验证新增
@RequestMapping("/influx/test")publicvoidtest(String type){
logger.info("进入influxdb方法");if("1".equals(type)){String line ="zw_pear,host=host1 value=1111.11";
influxdbService.writeLine(line);}elseif("2".equals(type)){Point point =Point.measurement("zw_apple").addTag("host","host1").addField("value",222.22).time(Instant.now(),WritePrecision.NS);
influxdbService.writePoint(point);}elseif("3".equals(type)){Orange orange =newOrange();
orange.setHost("host1");
orange.setValue(3333.33);
orange.setTime(Instant.now());
influxdbService.writePojo(orange);}elseif("4".equals(type)){
influxdbService.queryList();}}
分别用type1,2,3验证新增,
浏览器查看
用type为4查看查询
不同的业务场景,选择适合的中间件还是比较重要的。对于工业行业中需要采集声音,温度,湿度等的情况,实时观察数据变化趋势,根据趋势或者其他策略做出响应的预警提示,时序数据库是相对关系数据库而言更优的选择。
学海无涯苦作舟!!!
版权归原作者 weisian151 所有, 如有侵权,请联系我们删除。