Spring Boot中使用时序数据库InfluxDB
除了最常用的关系数据库和缓存之外,之前我们已经介绍了在Spring Boot中如何配置和使用MongoDB、LDAP这些存储的案例。接下来,我们继续介绍另一种特殊的数据库:时序数据库InfluxDB在Spring Boot中的使用。
InfluxDB简介
什么是时序数据库?全称为时间序列数据库。时间序列数据库主要用于指处理带时间标签(按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间序列数据。
时间序列数据主要由电力行业、化工行业等各类型实时监测、检查与分析设备所采集、产生的数据,这些工业数据的典型特点是:产生频率快(每一个监测点一秒钟内可产生多条数据)、严重依赖于采集时间(每一条数据均要求对应唯一的时间)、测点多信息量大(常规的实时监测系统均有成千上万的监测点,监测点每秒钟都产生数据,每天产生几十GB的数据量)。虽然关系型数据库也可以存储基于时间序列的数据,但由于存储结构上的劣势,使得这些数据无法高效的实现高频存储和查询统计,因此就诞生了一种专门针对时间序列来做存储和优化的数据库,以满足更高的效率要求。 -- 参考:百度百科:时序数据库
InfluxDB就是目前比较流行的开源时序数据库(官网地址:https://www.influxdata.com/),我们比较常见的使用场景就是一些与时间相关的高频的数据记录和统计需要,比如:监控数据的存储和查询。
在进行下面的动手环节之前,先了解一下InfluxDB中的几个重要名词:
- database:数据库
- measurement:类似于关系数据库中的table(表)
- points:类似于关系数据库中的row(一行数据)
其中,一个Point由三个部分组成:
- time:时间戳
- fields:记录的值
- tags:索引的属性
动手试试
在了解了什么是时序数据库以及InfluxDB一些基础概念之后,下面我们通过一个简单的定时上报监控数据的小案例,进一步理解InfluxDB的基础配置、数据组织和写入操作!
第一步:创建一个基础的Spring Boot项目(如果您还不会,可以参考这篇文章:快速入门1)
第二步:在pom.xml
中引入influx的官方SDK
<dependency>
<groupId>org.influxdb</groupId>
<artifactId>influxdb-java</artifactId>
</dependency>
注意:这里因为Spring Boot 2.x版本的parent中有维护InfluxDB的SDK版本,所以不需要手工指明版本信息。如果使用的Spring Boot版本比较老,那么可能会缺少version信息,就需要手工写了。
第三步:配置要连接的influxdb信息
spring.influx.url=http://localhost:8086
spring.influx.user=admin
spring.influx.password=
三个属性分别代表:连接地址、用户名、密码。到这一步,基础配置就完成了。
注意:虽然没有spring data的支持,但spring boot 2.x版本中也实现了InfluxDB的自动化配置,所以只需要写好配置信息,就可以使用了。具体配置属性可以查看源码:org.springframework.boot.autoconfigure.influx.InfluxDbProperties
。
第四步:创建定时任务,模拟上报数据,并写入InfluxDB
@Service
@AllArgsConstructor
@Slf4j
public class Monitor {
private InfluxDB influxDB;
@Scheduled(fixedRate = 5000)
public void writeQPS() {
// 模拟要上报的统计数据
int count = (int) (Math.random() * 100);
Point point = Point.measurement("ApiQPS") // ApiQPS表
.tag("url", "/hello") // url字段
.addField("count", count) // 统计数据
.time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) // 时间
.build();
// 往test库写数据
influxDB.write("test", "autogen", point);
log.info("上报统计数据:" + count);
}
}
测试验证
第一步:启动InfluxDB,并通过命令行准备好要使用的数据库,主要涉及的命令如下;
- 进入InfluxDB:
$ influx
- 查询当前存在的数据库:
> show databases
- 创建数据库(注意数据库名称与上面Java代码中write的第一个参数一致):
> create database "test"
第二步:启动Spring Boot应用,在定时任务的作用下,我们会看到类似下面的日志:
2021-08-03 01:52:47.732 INFO 94110 --- [ main] c.d.chapter63.Chapter63Application : Started Chapter63Application in 2.326 seconds (JVM running for 3.027)
2021-08-03 01:52:47.764 INFO 94110 --- [ scheduling-1] com.didispace.chapter63.Monitor : 上报统计数据:25
2021-08-03 01:52:52.736 INFO 94110 --- [ scheduling-1] com.didispace.chapter63.Monitor : 上报统计数据:30
2021-08-03 01:52:57.737 INFO 94110 --- [ scheduling-1] com.didispace.chapter63.Monitor : 上报统计数据:38
2021-08-03 01:53:02.739 INFO 94110 --- [ scheduling-1] com.didispace.chapter63.Monitor : 上报统计数据:51
2021-08-03 01:53:07.739 INFO 94110 --- [ scheduling-1] com.didispace.chapter63.Monitor : 上报统计数据:31
第三步:通过命令,查看一下InfluxDB中是否已经存在这些数据
> select * from ApiQPS order by time desc;
name: ApiQPS
time count url
---- ----- ---
1627926787730000000 31 /hello
1627926782730000000 51 /hello
1627926777729000000 38 /hello
1627926772727000000 30 /hello
1627926767728000000 25 /hello
可以看到,已经存在与日志中一样的数据了。
好了,今天的教程到这里结束了,记得自己动手试试哦!记得关注我,学习不迷路!后面我们还会再继续介绍,如何去展示这些时序数据!本系列教程《Spring Boot 2.x基础教程》点击直达!,欢迎收藏与转发!如果学习过程中如遇困难?可以加入我们Spring技术交流群,参与交流与讨论,更好的学习与进步!
代码示例
本文的完整工程可以查看下面仓库中的chapter6-3
目录:
- Github:https://github.com/dyc87112/SpringBoot-Learning/
- Gitee:https://gitee.com/didispace/SpringBoot-Learning/
如果您觉得本文不错,欢迎Star
支持,您的关注是我坚持的动力!
欢迎关注我的公众号:程序猿DD,分享外面看不到的干货与思考!
Spring Boot中使用时序数据库InfluxDB的更多相关文章
- Spring Boot中使用PostgreSQL数据库
在如今的关系型数据库中,有两个开源产品是你必须知道的.其中一个是MySQL,相信关注我的小伙伴们一定都不陌生,因为之前的Spring Boot关于关系型数据库的所有例子都是对MySQL来介绍的.而今天 ...
- 【Spring Boot&&Spring Cloud系列】Spring Boot中使用NoSql数据库Redis
github地址:https://github.com/AndyFlower/Spring-Boot-Learn/tree/master/spring-boot-nosql-redis 一.加入依赖到 ...
- Spring Boot中使用MongoDB数据库
前段时间分享了关于Spring Boot中使用Redis的文章,除了Redis之后,我们在互联网产品中还经常会用到另外一款著名的NoSQL数据库MongoDB. 下面就来简单介绍一下MongoDB,并 ...
- Spring Boot中使用Redis数据库
引入依赖 Spring Boot提供的数据访问框架Spring Data Redis基于Jedis.可以通过引入spring-boot-starter-redis来配置依赖关系. <depend ...
- 在Spring Boot中使用数据库事务
我们在前面已经分别介绍了如何在Spring Boot中使用JPA(初识在Spring Boot中使用JPA)以及如何在Spring Boot中输出REST资源(在Spring Boot中输出REST资 ...
- 使用spring boot中的JPA操作数据库
前言 Spring boot中的JPA 使用的同学都会感觉到他的强大,简直就是神器一般,通俗的说,根本不需要你写sql,这就帮你节省了很多时间,那么下面我们来一起来体验下这款神器吧. 一.在pom中添 ...
- spring boot(三):Spring Boot中Redis的使用
spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结 ...
- Spring Boot中的事务管理
原文 http://blog.didispace.com/springboottransactional/ 什么是事务? 我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合 ...
- Spring Boot中的注解
文章来源:http://www.tuicool.com/articles/bQnMra 在Spring Boot中几乎可以完全弃用xml配置文件,本文的主题是分析常用的注解. Spring最开始是为了 ...
随机推荐
- JavaScript 中的 Var,Let 和 Const 有什么区别
一.var 在ES5中,顶层对象的属性和全局变量是等价的,用var声明的变量既是全局变量,也是顶层变量 注意:顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象 var ...
- 源码学习之noop
/** * Perform no operation. * Stubbing args to make Flow happy without leaving useless transpiled co ...
- Jrebel、IDEA的激活与Springloaded使用
又有很长一段时间没写了,这次这篇随笔主要是分享下Jrebel与IDEA的激活方法以及推荐下Jrebel的替代工具Springloaded. 先来说下Jrebel的激活方法吧,之前有同事遇到了Jrebe ...
- Java进阶 | Proxy动态代理机制详解
一.Jvm加载对象 在说Java动态代理之前,还是要说一下Jvm加载对象的过程,这个依旧是理解动态代理的基础性原理: Java类即源代码程序.java类型文件,经过编译器编译之后就被转换成字节代码.c ...
- vue项目中一些标签直接放在<template>下会报错Failed to compile with 1 errors
原因是a标签button以及element-ui的组件不能直接放在<template>下,需要先有一个div,其他标签要放在div下
- 一文说透 Go 语言 HTTP 标准库
本篇文章来分析一下 Go 语言 HTTP 标准库是如何实现的. 转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/561 ...
- 14、WindowsServer修改NTP时间同步服务器
1. 2. 3.
- form 向java控制类 提交多表数据 、提交list数组数据
案例:form中有三个表的数据,一个主表,两个子表 1.在主表model类添加 对应子表数据集 2.界面上主表定义 3.控制类接收,直接用主表对象接收即可
- Spring Cloud中,如何解决Feign/Ribbon第一次请求失败的问题?
Spring Cloud中,如何解决Feign/Ribbon第一次请求失败的问题? Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题,要如何解 ...
- Spring WebFlux快速上手——响应式Spring的道法术器
https://blog.csdn.net/get_set/article/details/79480233