中间件学习--InfluxDB部署(docker)及springboot代码集成实例

一、需要了解的概念
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引了,可以直接引入配置类

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

@Data
@ConfigurationProperties(prefix = "influxdb")
public class InfluxdbProperties {
    private String url;
    private String bucket;
    private String org;
    private String token;
}

4、influxDB数据库客户端InfluxDBClient实例化和注入spring容器
初始化client连接和注入容器

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

@Configuration
@EnableConfigurationProperties(InfluxdbProperties.class)
public class InfluxdbConfig {

    @Bean
    public InfluxDBClient initInfluxDBClient(InfluxdbProperties properties){
        InfluxDBClient client = InfluxDBClientFactory.create(properties.getUrl(),properties.getToken().toCharArray(),properties.getOrg(),properties.getBucket());
        return client;
    }
}

5、封装InfluxDB工具类–封装新增和查询的方法
本例仅简单封装了一下,还有很多批量操作等其他接口,可以自己在点进去看下如何调用。

import com.alibaba.fastjson.JSON;
import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.QueryApi;
import com.influxdb.client.WriteApiBlocking;
import com.influxdb.client.domain.WritePrecision;
import com.influxdb.client.write.Point;
import com.influxdb.query.FluxRecord;
import com.influxdb.query.FluxTable;
import com.zw.study.influxdb.entity.Orange;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class InfluxdbService implements DisposableBean {

    @Autowired
    private InfluxDBClient client;

    @Autowired
    private InfluxdbProperties properties;

    // 新增1,字符串形式,格式:String data = "zw_pear,host=host1 value=1111.11";
    public void writeLine(String data){
        WriteApiBlocking writeApi = client.getWriteApiBlocking();
        writeApi.writeRecord(properties.getBucket(), properties.getOrg(), WritePrecision.NS, data);
    }

    // 新增2,Point形式
    public void writePoint(Point point){
        WriteApiBlocking writeApi = client.getWriteApiBlocking();
        writeApi.writePoint(properties.getBucket(), properties.getOrg(), point);
    }

    // 新增3,自定义pojo形式
    public void writePojo(Orange orange){
        WriteApiBlocking writeApi = client.getWriteApiBlocking();
        writeApi.writeMeasurement(WritePrecision.NS, orange);
    }

    @Override
    public void destroy() throws Exception {
        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));
        return null;
    }
}

6、测试和验证新增

    @RequestMapping("/influx/test")
    public void test(String type) {
        logger.info("进入influxdb方法");
        if ("1".equals(type)) {
            String line = "zw_pear,host=host1 value=1111.11";
            influxdbService.writeLine(line);
        } else if ("2".equals(type)) {
            Point point = Point
                    .measurement("zw_apple")
                    .addTag("host", "host1")
                    .addField("value", 222.22)
                    .time(Instant.now(), WritePrecision.NS);
            influxdbService.writePoint(point);
        } else if ("3".equals(type)) {
            Orange orange = new Orange();
            orange.setHost("host1");
            orange.setValue(3333.33);
            orange.setTime(Instant.now());
            influxdbService.writePojo(orange);
        } else  if ("4".equals(type)) {
            influxdbService.queryList();
        }
    }

分别用type1,2,3验证新增,
浏览器查看
在这里插入图片描述
用type为4查看查询
在这里插入图片描述

不同的业务场景,选择适合的中间件还是比较重要的。对于工业行业中需要采集声音,温度,湿度等的情况,实时观察数据变化趋势,根据趋势或者其他策略做出响应的预警提示,时序数据库是相对关系数据库而言更优的选择。

学海无涯苦作舟!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/490908.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习实验作业一----knn算法

机器学习课程的第一个算法knn算法&#xff0c;全称K-Nearest Neighbor&#xff0c;k最邻近算法&#xff0c;为机器学习中最常用&#xff0c;也是最简单的算法。KNN通过测量不同特征值之间的距离来进行分类。本文实现的是较为简单的knn算法&#xff0c;包括测试集&#xff0c;训…

pytorch中关于BF16、FP16的一些操作

文章目录 前提创建BF16和FP16的数据BF16和FP16的二进制存储格式如何根据十进制数得到对应的二进制存储如何根据二进制存储计算对应的十进制数&#xff1f;第一种方法第二种方法 二进制乘法如果是负数怎么办&#xff1f;如何手动计算BF16对应的的二进制存储格式参考链接 前提 好…

湖北汽车工业学院 实验一 关系数据库标准语言SQL

头歌 实验一 关系数据库标准语言SQL 制作不易&#xff01;点个关注呗&#xff01;为大家创造更多的价值&#xff01; 目录 头歌 实验一 关系数据库标准语言SQL**制作不易&#xff01;点个关注呗&#xff01;为大家创造更多的价值&#xff01;** 第一关&#xff1a;创建数据库第…

Chrome/Edge 使用 Markdown Viewer 查看 Markdown 格式文件

Chrome/Edge 使用 Markdown Viewer 查看 Markdown 格式文件 0. 引言1. 安装 Markdown Viewer 插件2. 使用 Markdown Viewer 阅读 Markdown 格式文件 0. 引言 大部分程序员都喜欢 Markdown 格式的文件&#xff0c;这时给一些没有在电脑上安装 Markdown 编辑器的同事分享资料时&…

脏牛提权(靶机复现)

目录 一、脏牛漏洞概述 二、漏洞复现 1.nmap信息收集 1.1.查看当前IP地址 1.2.扫描当前网段&#xff0c;找出目标机器 1.3.快速扫描目标机全端口 三、访问收集到的资产 192.168.40.134:80 192.168.40.134:1898 四、msf攻击 1.查找对应exp 2.选择对应exp并配置相关设…

基于nodejs+vue健美操评分系统python-flask-django-php

本系统采用的数据库是MySQL&#xff0c;使用nodejs技术开发。在设计过程中&#xff0c;很好地发挥了该开发方式的优势&#xff0c;让实现代码有了良好的可读性&#xff0c;而且使代码的更新和维护更加的方便&#xff0c;操作方便&#xff0c;对以后的维护减少了很多麻烦。系统的…

wpf程序调用macad的c++编写的dll

1.把macad里的build&#xff0c;source文件夹复制到一个文件夹里 2.创建一个wpf项目&#xff0c;在解决方案里添加macad.occt项目 3.把macad.occt设为dll文件&#xff0c;修改平台工具集&#xff0c;在macadtest里引用macad.occt 4.运行&#xff0c;应该会报错&#xff0c;说找…

「09」媒体源:播放本地或在线的音视频GIF文件

「09」媒体源播放本地或在线的音视频GIF文件 通过媒体源功能&#xff0c;您可以添加自己想要展示的各种视频内容&#xff0c;例如自己的视频课程、电影或客户见证视频、以及GIF动画等。 &#xff08;图层叠加效果&#xff09; &#xff08;绿幕抠像叠加效果&#xff09; 缺点…

Covalent Network(CQT)的以太坊时光机:在 Rollup 时代确保长期数据可用性

以太坊正在经历一场向 “Rollup 时代” 的转型之旅&#xff0c;这一转型由以太坊改进提案 EIP-4844 推动。这标志着区块链技术的一个关键转折&#xff0c;采用了一种被称为“数据块&#xff08;blobs&#xff09;”的新型数据结构。为了与以太坊的扩容努力保持一致&#xff0c;…

解析汽车充电桩主板的常见故障表现、原因及应对方法

充电桩主板作为充电桩的核心组件&#xff0c;直接影响着充电桩运行的安全性与稳定性。然而&#xff0c;在使用过程中&#xff0c;充电桩主板难免会因各种原因而出现一些故障情况&#xff0c;因此&#xff0c;了解这些原因并采取相应的应对方法对维护充电桩的正常运行起着至关重…

c语言应该怎么系统的学习?

c语言应该怎么系统的学习? 系统性学习C语言&#xff0c;这个描述首先是给人目标不明确&#xff0c;概念不清晰的映像。在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「c语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后…

centos7 安装influxdb+telegraf+grafana 监控服务器

influxdb influxdb是一个时间序列数据库, 所有数据记录都会打上时间戳, 适合存储数字类型的内容 telegraf telegraf 可以用于收集系统和服务的统计数据并发送到influxdb grafana grafana 是一个界面非常漂亮, 可直接读取influxdb数据展示成各种图表的开源可视化web软件 安…

探索 JDK 11 的新特性:迈向 Java 平台的下一个里程碑

随着时间的推移&#xff0c;Java 平台一直在不断演进和改进&#xff0c;为开发人员提供更好的工具和功能。JDK 11 是 Java 平台的一个重要版本&#xff0c;引入了许多新的特性和改进&#xff0c;为开发人员带来了全新的体验和可能性。本文将介绍 JDK 11 中一些重要的新特性&…

python基础语法--快速入门

目录 一、字面量1.1定义 二、关键字三、注释四、引号五、输入输出六、缩进七、数据类型转换八、标识符九、运算符 一、字面量 1.1定义 字面量&#xff1a;在代码中&#xff0c;被写下来的固定的值。 python中哪些值可以被写下来&#xff0c;如何在代码中写他们呢&#xff1f;…

JavaWeb开发-前端HTML基础

1.HTML的基本语法 HTML是什么&#xff1f;&#xff1a;HTML是一种超文本标记语言&#xff0c;负责网页的结构&#xff0c;设计页面的元素内容等 超文本&#xff1a;超越文本限制&#xff0c;除了文本信息&#xff0c;还可以定义图片&#xff0c;音频&#xff0c;视频等标记语言…

2024 年广西职业院校技能大赛高职组《云计算应用》赛项赛题第 5 套

#需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; 某企业根据自身业务需求&…

中科数安 || 公司办公文件资料加密、防泄密管理软件系统

#文件防泄密软件# 中科数安提供专业的公司文件资料加密与防泄密管理系统&#xff0c;这套软件主要服务于企业用户&#xff0c;以强化内部信息安全、防止重要数据泄露为核心目标。 中科数安 | 电脑文件防泄密软件 PC地址&#xff1a; www.weaem.com 该系统具备以下功能特性&a…

如何解决kafka rebalance导致的暂时性不能消费数据问题

文章目录 背景思考答案排它故障转移共享 背景 之前在review同组其它业务的时候&#xff0c;发现竟然把kafka去掉了&#xff0c;问了下原因&#xff0c;有一个单独的服务&#xff0c;我们可以把它称为agent&#xff0c;就是这个服务是动态扩缩容的&#xff0c;会采集一些指标&a…

格瑞纳电子邀您参观2024杭州快递物流展

2024长三角快递物流供应链与技术装备展览会 2024.7.8-10 杭州国际博览中心 参展企业介绍 北京格瑞纳电子产品有限公司是一家立足于专业科学技术领域集产品代理、培训咨询和个性化增值服务的高科技公司&#xff0c;于2009年成立于北京&#xff0c;立足于复杂系统仿真领域&…

水电站泄洪预警广播系统方案

一、行业背景 近年来由于危险河道管理措施不到位&#xff0c;调峰电站泄水风险长期存在&#xff0c;信息通报制度缺失以及民众安全警觉性不高等因素导致的水电站在泄洪时冲走下游河道游客以及人民财产的事故频发。 我司通过物联网、云计算、大数据、人工智能等技术手段&#x…