1. 前言🔥
前几期我们陆续讲解了Mysql、Redis、PostgreSQL、MongoDB等数据库集成及使用案例,接下来,bug菌继续给同学们介绍一种特殊的数据库,到底是什么数据库呢?它就是InfluxDB(时序数据库),InfluxDB是一款专门用于存储和查询时序数据的开源数据库,具有高效、可扩展等优点。在实时监控、IoT和大数据等领域得到广泛应用。而Spring Boot是一款快速开发的框架,可帮助我们快速构建基于Spring的应用程序,因其简洁、易用等优点,成为了开发者的首选。本文将介绍如何在Spring Boot项目中集成InfluxDB,并通过一个简单的示例演示其基本用法,希望能够帮助广大开发者更好地使用InfluxDB和Spring Boot开发时序数据应用。
那么,这将又会是干货满满的一期,全程无尿点不废话只抓重点教,具有非常好的学习效果,拿好小板凳准备就坐!希望学习的过程中大家认真听好好学,学习的途中有任何不清楚或疑问的地方皆可评论区留言或私信,bug菌将第一时间给予解惑,那么废话不多说,直接开整!Fighting!!
2. 环境说明🔥
本地的开发环境:
- 开发工具:IDEA 2021.3
- JDK版本: JDK 1.8
- Spring Boot版本:2.3.1 RELEASE
- Maven版本:3.8.2
3. 正文🔥
3.1 InfluxDB简介
InfluxDB是什么?它是一个用于存储和分析时间序列数据的开源数据库。由 Golang 语言编写,也是由 Golang 编写的软件中比较优秀的一个,在很多 Golang 的沙龙或者文章中都可能会把 InfluxDB 当标杆来介绍,这也间接帮助 InfluxDB 提高了知名度。
对于时序数据而言,它是一组按照时间维度索引的数据。时序数据在日常生活中也是随处可见,比如整点的温度、湿度等天气数据,每分钟的股票价格数据等。我们常见到的曲线图、柱状图等形式,就可以用来展现时序数据,这也就是我们常常听到的“数据可视化”。
时序数据库是一种非关系型数据库,以时间作为数据主键,专门用来存储时序数据。
而且在市面上,目前比较流行的时序数据库有:InfluxDB、TDengine、Prometheus、OpenTSDB等,其中InfluxDB在行业内应用使用最广泛。与此同时,刚进入业内视野的国产时序数据库TDengine也是后起之秀。对于Prometheus,它则是Prometheus监控系统中自带的数据库。
3.2 InfluxDB与Mysql类比
如下类比了关系型数据库Mysql,其实概念大差不差,辅助同学们更好的理解它。
mysql | influxdb | 备注 |
database | database | 数据库 |
table | measurement | 数据库 |
record | point | 一行记录数据 |
拓展:InfluxDB数据库由database、measurement、point等三部分构成。分别对应关系数据库中的数据库、表、数据行,具体概念分别如下:
- database:数据库.同Mysql等关系型数据库中的"数据库Database"
- measurement:数据表.相当于关系型数据库中的"表Table"
- point:数据点.表示单条数据记录,相当于关系型数据库中的"一行数据"
其中,Point是InfluxDB中独有的概念,一个Point由time、field、tags三类字段组成,其中三类字段及概念分别如下:
- time:时间戳
- fields:记录的值
- tags:索引的属性
3.3 InfluxDB特点
- 内置 HTTP 接口,使用方便。
- 数据可以打标记,这样查询可以很灵活。
- 类 SQL 的查询语句。
- 安装管理很简单,并且读写数据很高效。
- 能够实时查询,数据在写入时被索引后就能够被立即查出。
在最新的 DB-ENGINES(全球知名的数据库流行度排行榜网站) 公布的时间序列数据库排行榜中,InfluxDB 位于榜首,可想而知,InfluxDB 会越来越得到开发者及社区的广泛使用,形势一片大好。
3.4 InfluxDB使用场景
阅读完以上内容,想必同学们对时序数据库InfluxDB就有了一定的了解,那么,可能大家就会想它可以适用于那些场景呢?这可能是目前大家心里及其迫切想要知道的,必须学习个新东西,好歹要知道这个可以干什么用,用在那些地方,对吧。心急吃不了热豆腐,同学们接着往下看。
- IOT行业:电力、化工等工业物联网数据监测。
- 金融行业:各类金融产品及其衍生品、数字货币数据存储与量化研究。
- IT行业:服务器、虚拟机、容器等的状态数据实时监测。
- 互联网行业:用户行为轨迹,日志等数据。
这样同学们心里就有个清楚的认知,它大概可以干嘛用了吧,其实更多的领域它一样也能派上用场,任何一个数据库被设计出来, 往往局限它的不是数据库本身,而是使用者。
4. InfluxDB安装🔥
4.1 前言
接下里,我们就进行数据库的安装教学啦。对于InfluxDB的安装,非常之简单,根据操作系统执行对应的安装命令即可。这里我以window10系统为例,给同学们演示一波Windows下如何安装InfluxDB。
4.2 下载
InfluxDB下载url:https://dl.influxdata.com/influxdb/releases/influxdb-1.7.4_windows_amd64.zip
chronograf 下载url:https://dl.influxdata.com/chronograf/releases/chronograf-1.7.8_windows_amd64.zip
注意:chronograf 是 InfluxDB的可视化后台管理端,虽然InfluxDB也提供了控制台命令端,如果你使用不习惯,可以使用chronograf 可视化工具进行操作,例如Navicat。
4.2 解压安装包
本地下载好后,这里我们可以看到分别有两个压缩包,influxdb-1.7.4_windows_amd64.zip 与 chronograf-1.7.8_windows_amd64.zip,接下来是分别进行解压。
4.2.1 解压influxdb
influxdb-1.7.4_windows_amd64.zip解压后,我们可以看到influxDB的数据库文件非常简单。如下图所示:
4.2.2 修改配置文件
由于 InfluxDB 的数据存储主要有三个目录。默认情况下是 meta、wal 、 data 这三个目录,InfluxDB 应用程序启动后会自动生成,这个我们后续启动了再验证。
- meta 用于存储数据库的一些元数据,meta 目录下有一个 meta.db 文件。
- wal 目录存放预写日志文件,以 .wal 结尾。
- data 目录存放实际存储的数据文件,以 .tsm 结尾。
由于配置文件指定的默认路径,我们需要将其改为我们自己自定义的路径,方便查阅。
所以接下来我们需要对influxdb.conf 配置文件进行修改,修改如下三个地方的路径指向。
这里我们直接在安装路径下的路径,比如:E:\InfluxDB\influxdb-1.7.4-1,这个改成你们本地安装路径即可。修改样例如下:
//第26行
原:dir = "/var/lib/influxdb/meta"
新:dir = "E:/InfluxDB/influxdb-1.7.4-1/meta"
//第45行
原:dir = "/var/lib/influxdb/data"
新:dir = "E:/InfluxDB/influxdb-1.7.4-1/data"
//第48行
原:wal-dir = "/var/lib/influxdb/wal"
新:wal-dir = "E:/InfluxDB/influxdb-1.7.4-1/wal"
4.2.3 修改端口
InfluxDB服务默认端口为8086,如果你需要指定端口号,则可以修改如下配置。配置文件的第256行,将端口号设置放开并指定你想要的端口号即可,一般我是端口号默认即可。
4.3 启动服务
配置文件修改后,我们记得保存一下,如何启动InfluxDB服务?很坚定,直接运行Influxd.exe使用默认配置运行即可,这里也可以使用自定义的配置文件,则指定conf文件进行启动,自定义配置使用的启动命令如下:
先cmd 进入influxDB目录,然后执行以下命令即可:
influxd.exe -config influxdb.conf
如果就使用默认配置启动,则直接双击【Influxd.exe】即可启动。
双击【Influxd.exe】后会直接弹出一个小黑窗口,如果你的窗口内容看到如下输出,则就说明InfluxDB服务启动成功了。
到此,InfluxDB服务就启动好了。
4.4 InfluxDB使用
对于关系型数据库,例如Mysql,它有它自己的sql语法规则,而 InfluxDB 的也有它的sql语法---InfluxQL。InfluxQL是一种类似于SQL的查询语言,用于与InfluxDB数据库进行交互。
如果你有使用关系数据库及SQL的基础,那么你可以非常快的掌握InfluxQL。但是,InfluxQL与SQL又不全一样,它缺乏SQL中的一些高级的语法,例如union,having、join等。
接下来,我们就来演示一下InfluxQL语言的使用方法。
4.5 连接InfluxDB服务
进入到InfluxDB安装目录后,选中文件全路径,输入cmd回车。会弹出小黑框。
然后在cmd小黑框中输入:influx 即可。
为此你就可以在该输入框中进行sql执行啦,接下来我带着大家进行学习并实践操作一下吧。
4.6 数据库操作
4.6.1 数据库创建
这里我们先来创建一个名为influx_demo的数据库,数据库名你们随意。
//创建数据库语句
CREATE DATABASE influx_demo
很明显是创建【influx_demo】数据库成功了。
4.6.2 查询所有数据库
查询显示所有的数据库,命令如下:
SHOW DATABASES
4.6.3 数据库删除
DROP DATABASE influx_demo
对指定数据库进行删除,命令如下:
这里我们先执行删除命令再查询核实,数据库确实不存在了。
4.6.4 数据库使用
对指定的数据库进行使用,命令如下:
USE influx_demo
4.7 表操作
4.7.1 创建表
由于InfluxDB中没有专门创建表的命令sql,当插入一条数据point至某B表时,此B表会被自动创建,并且表的格式、字段名、字段类型也由此条插入命令决定。
4.7.2 修改表
与创建表一样,InfluxDB中也没有修改表的命令sql,但当插入一条新数据point至某表B时,如果此point中的字段多于原B表的字段,会自动修改B表与此条插入数据的格式字段一致。
注意:此种情况仅限于新插入的数据字段与表B字段的交集即表B的情况,如果新插入数据字段与表A完全不同则会插入失败从而表结构也不变。
4.7.3 查询表
查询指定数据库下的表列表,前提是需要使用那个库,命令如下:
SHOW MEASUREMENTS
演示如下:
4.7.4 删除表
删除表也是在使用某个数据库下进行操作的,删除表命令如下:
DROP MEASUREMENT "measurementName"
演示如下:删除名为"user"的表。
4.8 数据操作
4.8.1 插入数据
插入语句语法如下:
insert + measurement + "," + tag=value,tag=value + 空格 + field=value,field=value ;
tag与tag之间要用逗号[,]分隔;field与field之间用逗号[,]分隔; tag与field之间用空格[ ]分隔; tag都是string类型,不需要引号将value包裹; field如果是string类型,需要加引号;
我先来给大家举个新增数据的例子:
insert weather,altitude=1001,area=南 temperature=10,humidity=-4
具体可以看到数据已经被插入了。 且进行weather表查询了,也证实了weather表被自动创建了。
4.8.2 查询数据
查询语句格式与mysql 基本一致,使用select 关键字。
select * from weather
演示如下:
4.8.3 修改数据
当 tags 和 timestamp 相同时数据会执行覆盖操作,相当于InfluxDB的更新操作。
现在我们来做个演示:我们针对第一条数据进行数据修改操作。
修改前:
修改后:
执行insert 语句:
insert weather,altitude=1001,area=南 humidity=-8,temperature=7 1691634804880043400
对比修改前,同条数据的humidity、temperature 内容已经被成功修改了。
案例完整执行代码如下:
> select * from weather
name: weather
time altitude area humidity temperature
---- -------- ---- -------- -----------
1691634804880043400 1001 南 -5 10
1691635565148254500 300 东 9 30
>
> insert weather,altitude=1001,area=南 humidity=-8,temperature=7 1691634804880043400
> select * from weather
name: weather
time altitude area humidity temperature
---- -------- ---- -------- -----------
1691634804880043400 1001 南 -8 7
1691635565148254500 300 东 9 30
>
4.8.4 删除数据
删除语法与Mysql数据库的删除语法一样,都是使用delete关键字。
演示如下:
根据时间删除: SQL如下:
delete from weather where time = 1691634804880043400;
sql具体执行如下:
根据网上众多资料提示可以根据 tags 进行删除,经过反复测试,删除失败了,并报err提示该字段不支持,执行语句如下:
> delete from weather where altitude = 1001
> delete from weather where area = 东
具体执行大家请看如下!
所以这个删除语法暂时是不可取的,请大家避坑。
4.9 InfluxDB用户管理
接下来给大家普及下InfluxDB数据库的用户管理相关知识,对于InfluxDB而言,默认管理员账号为admin,密码默认为为空,这里我们也可以添加用户和权限,如下我具体给同学们演示一下。
4.9.1 显示用户
显示当前所有的用户,语法如下:
> show users
具体语句执行如下:
4.9.2 创建用户
如下演示下如何添加用户,具体语法如下:
> create user "test" with password '123456'
具体执行如下:
4.9.3 创建管理员权限用户
创建一个管理员用户并赋予所有权限,语法如下:
> create user "test1" with password '123456' with all privileges
具体执行如下:
4.9.4 删除用户
如下演示如何删除用户,具体如下:
> drop user "test"
具体执行如下:
以上就是对InfluxDB数据库操作的一些基本总结,如若了解更多可以其复杂用法可以上其官网专门学习,这里就不具体深入介绍实践了。
5. Spring Boot集成InfluxDB🔥
上一期,给大家介绍了InfluxDB数据库的安装和一些日常使用,接下来是给大家演示Spring Boot项目如何集成InfluxDB并实战使用,通过代码实现数据的增删改查,接下来请看是如何实现的,具有很好的教学意义,请同学们认真听,好好学哦。
5.1 创建Spring Boot项目
这里创建一个基础的Spring Boot项目雏形,如果你还不清楚,这里推荐你参考我的这篇《Spring Boot项目如何快速搭建》
5.2 添加依赖
接着在你项目的pom.xml配置文件中引入InfluxDB的官方SDK,这里需要注意,如果你使用的Spring Boot版本在 2以下或者更旧,就需要手动指明InfluxDB版本号,由于我是用的Spring Boot 2.3版本,在Spring Boot 2.x版本的parent中有维护InfluxDB的SDK版本,顾可以省略手动指定InfluxDB的SDK版本。
引入依赖配置如下:
<dependency>
<groupId>org.influxdb</groupId>
<artifactId>influxdb-java</artifactId>
</dependency>
5.3 配置InfluxDB连接
这里需要在项目中配置InfluxDB的连接信息,比如连接地址、用户名、密码。
spring:
influx:
url: http://localhost:8086
user: admin
password:
注意:这里我们不需要再额外配置与其InfluxDB的连接属性了,虽然没有Spring data的支持,但在Spring Boot2.x版本中也实现了InfluxDB的自动化配置,所以这里只需要在配置中配置好如上三个属性即可正常使用了,具体配置属性如何注入且进行连接的可以去查看对于的源码:
org.springframework.boot.autoconfigure.influx.InfluxDbProperties
完成以上几步后,基础配置就完成了,接着我们就可以在代码中对其进行增删改查操作了。
5.4 模拟上报数据入库
这里我们来简单模拟一个场景,创建一个定时任务来模拟数据的新增并保存到InfluxDB数据库中。具体演示代码如下:
package com.example.demo.service.impl;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.influxdb.InfluxDB;
import org.influxdb.dto.Point;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
@Service
@AllArgsConstructor
@Slf4j
public class InfluxDBMonitor {
private InfluxDB influxDB;
@Scheduled(fixedRate = 5000) //5秒执行一次
public void InsertDataForInfluxDB() {
//随机数字
int count = (int) (Math.random() * 100);
Point point = Point.measurement("test_count") // 表名
.tag("index", "index") // 索引字段名
.addField("count", count) // 字段名1
.addField("count_str", "str_" + count) // 字段名2
.time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) // 时间
.build();
// 往test_count库插入数据
influxDB.write("influx_demo", "autogen", point);
log.info("写入数据库的count值为:" + count);
}
}
如上定时插入数据的方法写好了,重启项目即可触发,但我们提前要先去准备创建好所对应的库。
5.5 测试
5.5.1 连接InfluxDB
先启动InfluxDB服务,不清楚具体如何启动的这里可以看我上一期教学《InfluxDB数据库如何本地搭建并使用》,如下就已经启动并连接ok了。
5.5.2 创建数据库
这里我们先创建好一个名为:Influx_demo 的库,具体语句如下:
//创建数据库语句
CREATE DATABASE influx_demo
如上可见很明显是创建【influx_demo】数据库成功了。
注意: 数据库名称与上面代码方法InsertDataForInfluxDB()中定义的库名一致。
5.5.3 查询数据库
5.5.4 启动Spring Boot项目
库已经创建好了,接着我们只需要触发我们刚写的定时插入数据的方法即可。
启动后,我们可以看到间隔5s就自动打印了一条count值,接下来,我们就是要验证数据是否被成功新增到【test_count】表中。
5.5.5 查询表数据
我们直接通过查询语句,验证数据是否被新增到【test_count】表中,查询语句如下:
select * from test_count;
如下是具体查询出来的结果:
5.6 小结
整体体验下来,最大的感触就是,如果项目的功能模块中用到对时间特性比较敏感的数据,例如性能监控,数据趋势走向等需求场景时,InfluxDB将会是一个不错的选择,虽然其很强很彪悍,但只要在使用的过程中遵循一定规范与适用场景,才能发挥其优秀的特性。
6. 热文推荐🔥
滴~如下推荐【Spring Boot 进阶篇】的学习大纲,请小伙伴们注意查收。
Spring Boot进阶(01):Spring Boot 集成 Redis,实现缓存自由
Spring Boot进阶(02):使用Validation进行参数校验
Spring Boot进阶(03):如何使用MyBatis-Plus实现字段的自动填充
Spring Boot进阶(04):如何使用MyBatis-Plus快速实现自定义sql分页
Spring Boot进阶(05):Spring Boot 整合RabbitMq,实现消息队列服务
Spring Boot进阶(06):Windows10系统搭建 RabbitMq Server 服务端
Spring Boot进阶(07):集成EasyPoi,实现Excel/Word的导入导出
Spring Boot进阶(08):集成EasyPoi,实现Excel/Word携带图片导出
Spring Boot进阶(09):集成EasyPoi,实现Excel文件多sheet导入导出
Spring Boot进阶(10):集成EasyPoi,实现Excel模板导出成PDF文件
Spring Boot进阶(11):Spring Boot 如何实现纯文本转成.csv格式文件?
Spring Boot进阶(12):Spring Boot 如何获取Excel sheet页的数量?
Spring Boot进阶(13):Spring Boot 如何获取@ApiModelProperty(value = “序列号“, name = “uuid“)中的value值name值?
Spring Boot进阶(14):Spring Boot 如何手动连接库并获取指定表结构?一文教会你
Spring Boot进阶(15):根据数据库连接信息指定分页查询表结构信息
Spring Boot进阶(16):Spring Boot 如何通过Redis实现手机号验证码功能?
Spring Boot进阶(17):Spring Boot如何在swagger2中配置header请求头等参数信息
Spring Boot进阶(18):SpringBoot如何使用@Scheduled创建定时任务?
Spring Boot进阶(19):Spring Boot 整合ElasticSearch
Spring Boot进阶(20):配置Jetty容器
Spring Boot进阶(21):配置Undertow容器
Spring Boot进阶(22):Tomcat与Undertow容器性能对比分析
Spring Boot进阶(23):实现文件上传
Spring Boot进阶(24):如何快速实现多文件上传?
Spring Boot进阶(25):文件上传的单元测试怎么写?
Spring Boot进阶(26):Mybatis 中 resultType、resultMap详解及实战教学
Spring Boot进阶(27):Spring Boot 整合 kafka(环境搭建+演示)
Spring Boot进阶(28):Jar包Linux后台启动部署及滚动日志查看,日志输出至实体文件保存
Spring Boot进阶(29):如何正确使用@PathVariable,@RequestParam、@RequestBody等注解?不会我教你,结合Postman演示
Spring Boot进阶(30):@RestController和@Controller 注解使用区别,实战演示
...
7. 文末🔥
如果想系统性的学习Spring Boot,小伙伴们直接订阅bug菌专门为大家创建的Spring Boot专栏《滚雪球学Spring Boot》从入门到精通,从无到有,从零到一!以知识点+实例+项目的学习模式由浅入深对Spring Boot框架进行学习&使用。
如果你有一定的基础却又想精进Spring Boot,那么《Spring Boot进阶实战》将会是你的最好的选择;此栏进行知识点+实例+项目的学习方式全面深入框架剖析及各种高阶玩法,励志打造全网最全最新springboot学习专栏,投资学习自己性价比最高。
本文涉及所有源代码,均已上传至github开源,供同学们一对一参考,GitHub,同时,原创开源不易,欢迎给个star🌟,想体验下被加Star的感jio,非常感谢 ❗
我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
关注公众号,获取最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等硬核资源