除了最常用的關聯式資料庫和快取之外,之前我們已經介紹了在Spring Boot中如何配置和使用MongoDB、LDAP這些儲存的案例。接下來,我們繼續介紹另一個特殊的資料庫:時序資料庫InfluxDB在Spring Boot中的使用。
什麼是時序資料庫?全稱為時間序列資料庫。時間序列資料庫主要用於指處理帶時間標籤(按照時間的順序變化,即時間序列化)的數據,帶時間標籤的數據也稱為時間序列數據。
時間序列資料主要由電力產業、化學產業等各類型即時監測、檢查與分析設備所收集、產生的數據,這些工業數據的典型特點是:產生頻率快(每一個監測點一秒鐘內可產生多條數據)、嚴重依賴採集時間(每一條數據均要求對應唯一的時間)、測點多信息量大(常規的實時監測系統均有成千上萬的監測點,監測點每秒鐘都產生數據,每天產生幾十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
可以看到,已經存在與日誌中一樣的資料了。
好了,今天的教學到這裡結束了,記得自己動手試試哦!
相關影片教學推薦:Java影片教學
#以上是教你一招搞定時序資料庫在Spring Boot中的使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!