除了最常用的關(guān)系數(shù)據(jù)庫和緩存之外,之前我們介紹了在Spring Boot中如何配置和使用MongoDB、LDAP這些存儲的案例。接下來,我們繼續(xù)介紹另一種特殊的數(shù)據(jù)庫:時序數(shù)據(jù)庫InfluxDB在Spring Boot中的使用。
InfluxDB簡介
什么是時序數(shù)據(jù)庫?全稱為時間序列數(shù)據(jù)庫。時間序列數(shù)據(jù)庫主要用于指處理帶時間標(biāo)簽(按照時間的順序變化,即時間序列化)的數(shù)據(jù),帶時間標(biāo)簽的數(shù)據(jù)也稱為時間序列數(shù)據(jù)。 時間序列數(shù)據(jù)主要由電力行業(yè)、化工行業(yè)等各類型實(shí)時監(jiān)測、檢查與分析設(shè)備所采集、產(chǎn)生的數(shù)據(jù),這些工業(yè)數(shù)據(jù)的典型特點(diǎn)是:產(chǎn)生頻率快(每一個監(jiān)測點(diǎn)一秒鐘內(nèi)可產(chǎn)生多條數(shù)據(jù))、嚴(yán)重依賴于采集時間(每一條數(shù)據(jù)均要求對應(yīng)唯一的時間)、測點(diǎn)多信息量大(常規(guī)的實(shí)時監(jiān)測系統(tǒng)均有成千上萬的監(jiān)測點(diǎn),監(jiān)測點(diǎn)每秒鐘都產(chǎn)生數(shù)據(jù),每天產(chǎn)生幾十GB的數(shù)據(jù)量)。雖然關(guān)系型數(shù)據(jù)庫也可以存儲基于時間序列的數(shù)據(jù),但由于存儲結(jié)構(gòu)上的劣勢,使得這些數(shù)據(jù)無法高效的實(shí)現(xiàn)高頻存儲和查詢統(tǒng)計,因此就誕生了一種專門針對時間序列來做存儲和優(yōu)化的數(shù)據(jù)庫,以滿足更高的效率要求。
InfluxDB就是目前比較流行的開源時序數(shù)據(jù)庫(官網(wǎng)地址:https://www.influxdata.com/),我們比較常見的使用場景就是一些與時間相關(guān)的高頻的數(shù)據(jù)記錄和統(tǒng)計需要,比如:監(jiān)控數(shù)據(jù)的存儲和查詢。
在進(jìn)行下面的動手環(huán)節(jié)之前,先了解一下InfluxDB中的幾個重要名詞:
- database:數(shù)據(jù)庫
- measurement:類似于關(guān)系數(shù)據(jù)庫中的table(表)
- points:類似于關(guān)系數(shù)據(jù)庫中的row(一行數(shù)據(jù))
其中,一個Point由三個部分組成:
- time:時間戳
- fields:記錄的值
- tags:索引的屬性
動手試試
在了解了什么是時序數(shù)據(jù)庫以及InfluxDB一些基礎(chǔ)概念之后,下面我們通過一個簡單的定時上報監(jiān)控數(shù)據(jù)的小案例,進(jìn)一步理解InfluxDB的基礎(chǔ)配置、數(shù)據(jù)組織和寫入操作!
第一步:創(chuàng)建一個基礎(chǔ)的Spring Boot項(xiàng)目
第二步:在pom.xml
中引入influx的官方SDK
<dependency>
<groupId>org.influxdb</groupId>
<artifactId>influxdb-java</artifactId>
</dependency>
注意:這里因?yàn)镾pring Boot 2.x版本的parent中有維護(hù)InfluxDB的SDK版本,所以不需要手工指明版本信息。如果使用的Spring Boot版本比較老,那么可能會缺少version信息,就需要手工寫了。
第三步:配置要連接的influxdb信息
spring.influx.url=http://localhost:8086
spring.influx.user=admin
spring.influx.password=
三個屬性分別代表:連接地址、用戶名、密碼。到這一步,基礎(chǔ)配置就完成了。
注意:雖然沒有spring data的支持,但spring boot 2.x版本中也實(shí)現(xiàn)了InfluxDB的自動化配置,所以只需要寫好配置信息,就可以使用了。具體配置屬性可以查看源碼:org.springframework.boot.autoconfigure.influx.InfluxDbProperties
。
第四步:創(chuàng)建定時任務(wù),模擬上報數(shù)據(jù),并寫入InfluxDB
@Service
@AllArgsConstructor
@Slf4j
public class Monitor {
private InfluxDB influxDB;
@Scheduled(fixedRate = 5000)
public void writeQPS() {
// 模擬要上報的統(tǒng)計數(shù)據(jù)
int count = (int) (Math.random() * 100);
Point point = Point.measurement("ApiQPS") // ApiQPS表
.tag("url", "/hello") // url字段
.addField("count", count) // 統(tǒng)計數(shù)據(jù)
.time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) // 時間
.build();
// 往test庫寫數(shù)據(jù)
influxDB.write("test", "autogen", point);
log.info("上報統(tǒng)計數(shù)據(jù):" + count);
}
}
測試驗(yàn)證
第一步:啟動InfluxDB,并通過命令行準(zhǔn)備好要使用的數(shù)據(jù)庫,主要涉及的命令如下;
- 進(jìn)入InfluxDB:
$ influx
- 查詢當(dāng)前存在的數(shù)據(jù)庫:
> show databases
- 創(chuàng)建數(shù)據(jù)庫(注意數(shù)據(jù)庫名稱與上面Java代碼中write的第一個參數(shù)一致):
> create database "test"
第二步:啟動Spring Boot應(yīng)用,在定時任務(wù)的作用下,我們會看到類似下面的日志:
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 : 上報統(tǒng)計數(shù)據(jù):25
2021-08-03 01:52:52.736 INFO 94110 --- [ scheduling-1] com.didispace.chapter63.Monitor : 上報統(tǒng)計數(shù)據(jù):30
2021-08-03 01:52:57.737 INFO 94110 --- [ scheduling-1] com.didispace.chapter63.Monitor : 上報統(tǒng)計數(shù)據(jù):38
2021-08-03 01:53:02.739 INFO 94110 --- [ scheduling-1] com.didispace.chapter63.Monitor : 上報統(tǒng)計數(shù)據(jù):51
2021-08-03 01:53:07.739 INFO 94110 --- [ scheduling-1] com.didispace.chapter63.Monitor : 上報統(tǒng)計數(shù)據(jù):31
第三步:通過命令,查看一下InfluxDB中是否已經(jīng)存在這些數(shù)據(jù)
> 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
可以看到,已經(jīng)存在與日志中一樣的數(shù)據(jù)了。
注:本文轉(zhuǎn)載自“程序猿DD”,如有侵權(quán),請聯(lián)系刪除!