close
關注我,回復關鍵字「spring」,
免費領取Spring學習資料。

除了最常用的關係數據庫和緩存之外,之前我們已經介紹了在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項目(如果您還不會,可以參考這篇文章:快速入門:https://blog.didispace.com/spring-boot-learning-21-1-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:8086spring.influx.user=adminspring.influx.password=

三個屬性分別代表:連接地址、用戶名、密碼。到這一步,基礎配置就完成了。

注意:雖然沒有spring data的支持,但spring boot 2.x版本中也實現了InfluxDB的自動化配置,所以只需要寫好配置信息,就可以使用了。具體配置屬性可以查看源碼:org.springframework.boot.autoconfigure.influx.InfluxDbProperties。

第四步:創建定時任務,模擬上報數據,並寫入InfluxDB

@Service@AllArgsConstructor@Slf4jpublicclassMonitor{privateInfluxDBinfluxDB;@Scheduled(fixedRate=5000)publicvoidwriteQPS(){//模擬要上報的統計數據intcount=(int)(Math.random()*100);Pointpoint=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
查詢當前存在的數據庫:
>showdatabases
創建數據庫(注意數據庫名稱與上面Java代碼中write的第一個參數一致):
>createdatabase"test"

第二步:啟動Spring Boot應用,在定時任務的作用下,我們會看到類似下面的日誌:

2021-08-0301:52:47.732INFO94110---[main]c.d.chapter63.Chapter63Application:StartedChapter63Applicationin2.326seconds(JVMrunningfor3.027)2021-08-03 01:52:47.764 INFO 94110---[ scheduling-1] com.didispace.chapter63.Monitor :上報統計數據:252021-08-03 01:52:52.736 INFO 94110---[ scheduling-1] com.didispace.chapter63.Monitor :上報統計數據:302021-08-03 01:52:57.737 INFO 94110---[ scheduling-1] com.didispace.chapter63.Monitor :上報統計數據:382021-08-03 01:53:02.739 INFO 94110---[ scheduling-1] com.didispace.chapter63.Monitor :上報統計數據:512021-08-03 01:53:07.739 INFO 94110---[ scheduling-1] com.didispace.chapter63.Monitor :上報統計數據:31

第三步:通過命令,查看一下InfluxDB中是否已經存在這些數據

>select*fromApiQPSorderbytimedesc;name:ApiQPStimecounturl------------162792678773000000031/hello162792678273000000051/hello162792677772900000038/hello162792677272700000030/hello162792676772800000025/hello

可以看到,已經存在與日誌中一樣的數據了。

好了,今天的教程到這裡結束了,記得自己動手試試哦!記得關注我,學習不迷路!後面我們還會再繼續介紹,如何去展示這些時序數據!

本系列教程《Spring Boot 2.x基礎教程》:http://blog.didispace.com/spring-boot-learning-2x/,歡迎收藏與轉發!

代碼示例

本文的完整工程可以查看下面倉庫中的chapter6-3目錄:

Github:https://github.com/dyc87112/SpringBoot-Learning/
Gitee:https://gitee.com/didispace/SpringBoot-Learning/

如果您覺得本文不錯,歡迎Star支持,您的關注是我堅持的動力!



END



現在可以為 Spring Boot 3.0 做哪些準備?
Spring Boot 使用 Elastic Job 實現定時任務
推薦一個好看的IDEA主題和圖標集
Spring Boot中使用PostgreSQL數據庫
Spring Cloud Gateway CORS方案看這篇就夠了

關注後端面試那些事,回復【2022面經】

獲取最新大廠Java面經


最後重要提示:高質量的技術交流群,限時免費開放,今年抱團最重要。想進群的,關注SpringForAll社區,回復關鍵詞:加群,拉你進群。




點擊「閱讀原文」領取2022大廠面經
↓↓↓
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()