天天看點

Spring Boot 2.x基礎教程:使用時序資料庫InfluxDB

除了最常用的關系資料庫和緩存之外,之前我們已經介紹了在Spring Boot中如何配置和使用 MongoDB LDAP 這些存儲的案例。接下來,我們繼續介紹另一種特殊的資料庫:時序資料庫InfluxDB在Spring Boot中的使用。

https://blog.didispace.com/spring-boot-learning-2-6-3/#InfluxDB%E7%AE%80%E4%BB%8B InfluxDB簡介

什麼是時序資料庫?全稱為時間序列資料庫。時間序列資料庫主要用于指處理帶時間标簽(按照時間的順序變化,即時間序列化)的資料,帶時間标簽的資料也稱為時間序列資料。

時間序列資料主要由電力行業、化工行業等各類型實時監測、檢查與分析裝置所采集、産生的資料,這些工業資料的典型特點是:産生頻率快(每一個監測點一秒鐘内可産生多條資料)、嚴重依賴于采集時間(每一條資料均要求對應唯一的時間)、測點多資訊量大(正常的實時監測系統均有成千上萬的監測點,監測點每秒鐘都産生資料,每天産生幾十GB的資料量)。雖然關系型資料庫也可以存儲基于時間序列的資料,但由于存儲結構上的劣勢,使得這些資料無法高效的實作高頻存儲和查詢統計,是以就誕生了一種專門針對時間序列來做存儲和優化的資料庫,以滿足更高的效率要求。 – 參考:

百度百科:時序資料庫

InfluxDB就是目前比較流行的開源時序資料庫(官網位址:

https://www.influxdata.com/

),我們比較常見的使用場景就是一些與時間相關的高頻的資料記錄和統計需要,比如:監控資料的存儲和查詢。

在進行下面的動手環節之前,先了解一下InfluxDB中的幾個重要名詞:

  • database:資料庫
  • measurement:類似于關系資料庫中的table(表)
  • points:類似于關系資料庫中的row(一行資料)

其中,一個Point由三個部分組成:

  • time:時間戳
  • fields:記錄的值
  • tags:索引的屬性

https://blog.didispace.com/spring-boot-learning-2-6-3/#%E5%8A%A8%E6%89%8B%E8%AF%95%E8%AF%95 動手試試

在了解了什麼是時序資料庫以及InfluxDB一些基礎概念之後,下面我們通過一個簡單的定時上報監控資料的小案例,進一步了解InfluxDB的基礎配置、資料組織和寫入操作!

第一步:建立一個基礎的Spring Boot項目(如果您還不會,可以參考這篇文章:

快速入門

第二步:在

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技術交流群

,參與交流與讨論,更好的學習與進步!

https://blog.didispace.com/spring-boot-learning-2-6-3/#%E4%BB%A3%E7%A0%81%E7%A4%BA%E4%BE%8B 代碼示例

本文的完整工程可以檢視下面倉庫中的

chapter6-3

目錄:

如果您覺得本文不錯,歡迎

Star

支援,您的關注是我堅持的動力!