激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Springboot使用influxDB時序數(shù)據(jù)庫的實現(xiàn)

Springboot使用influxDB時序數(shù)據(jù)庫的實現(xiàn)

2021-11-04 10:48從此寂靜無 Java教程

項目中需要存放大量設(shè)備日志,且需要對其進(jìn)行簡單的數(shù)據(jù)分析,信息提取工作,所以本文就介紹一下Springboot使用influxDB時序數(shù)據(jù)庫,感興趣的可以了解一下

項目中需要存放大量設(shè)備日志,且需要對其進(jìn)行簡單的數(shù)據(jù)分析,信息提取工作.

結(jié)合眾多考量因素,項目決定使用時序數(shù)據(jù)庫中的領(lǐng)頭羊InfluxDB.

引入依賴

項目中使用influxdb-java,在pom文件中添加如下依賴(github地址:https://github.com/influxdata/influxdb-java):

?
1
2
3
4
5
<dependency>
    <groupId>org.influxdb</groupId>
    <artifactId>influxdb-java</artifactId>
    <version>2.15</version>
</dependency>

application.yaml文件配置如下所示(請按照實際情況填寫):

?
1
2
3
4
5
6
spring:
  influx:
    url: *
    password: admin
    user: 123
    database: log_management

配置

(1) 創(chuàng)建配置類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Configuration
public class InfluxDbConfig {
 
    @Value("${spring.influx.url:''}")
    private String influxDBUrl;
 
    @Value("${spring.influx.user:''}")
    private String userName;
 
    @Value("${spring.influx.password:''}")
    private String password;
 
    @Value("${spring.influx.database:''}")
    private String database;
 
    @Bean
    public InfluxDbUtils influxDbUtils() {
        return new InfluxDbUtils(userName, password, influxDBUrl, database, "");
    }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
@Data
 public class InfluxDbUtils {
    private String userName;
    private String password;
    private String url;
    public String database;
    private String retentionPolicy;
    // InfluxDB實例
    private InfluxDB influxDB;
 
    // 數(shù)據(jù)保存策略
    public static String policyNamePix = "logRetentionPolicy_";
 
    public InfluxDbUtils(String userName, String password, String url, String database,
                         String retentionPolicy) {
        this.userName = userName;
        this.password = password;
        this.url = url;
        this.database = database;
        this.retentionPolicy = retentionPolicy == null || "".equals(retentionPolicy) ? "autogen" : retentionPolicy;
        this.influxDB = influxDbBuild();
    }
 
    /**
     * 連接數(shù)據(jù)庫 ,若不存在則創(chuàng)建
     *
     * @return influxDb實例
     */
    private InfluxDB influxDbBuild() {
        if (influxDB == null) {
            influxDB = InfluxDBFactory.connect(url, userName, password);
        }
        try {
            createDB(database);
            influxDB.setDatabase(database);
        } catch (Exception e) {
            log.error("create influx db failed, error: {}", e.getMessage());
        } finally {
            influxDB.setRetentionPolicy(retentionPolicy);
        }
        influxDB.setLogLevel(InfluxDB.LogLevel.BASIC);
        return influxDB;
    }
 }

構(gòu)建實體類

InfluxDB中,measurement對應(yīng)于傳統(tǒng)關(guān)系型數(shù)據(jù)庫中的table(database為配置文件中的log_management).
InfluxDB里存儲的數(shù)據(jù)稱為時間序列數(shù)據(jù),時序數(shù)據(jù)有零個或多個數(shù)據(jù)點.
數(shù)據(jù)點包括time(一個時間戳),measurement(例如logInfo),零個或多個tag,其對應(yīng)于level,module,device_id),至少一個field(即日志內(nèi)容,msg=something error).
InfluxDB會根據(jù)tag數(shù)值建立時間序列(因此tag數(shù)值不能選取諸如UUID作為特征值,易導(dǎo)致時間序列過多,導(dǎo)致InfluxDB崩潰),并建立相應(yīng)索引,以便優(yōu)化諸如查詢速度.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Builder
@Data
@Measurement(name = "logInfo")
public class LogInfo {
 
    // Column中的name為measurement中的列名
    // 此外,需要注意InfluxDB中時間戳均是以UTC時保存,在保存以及提取過程中需要注意時區(qū)轉(zhuǎn)換
    @Column(name = "time")
    private String time;
    // 注解中添加tag = true,表示當(dāng)前字段內(nèi)容為tag內(nèi)容
    @Column(name = "module", tag = true)
    private String module;
    @Column(name = "level", tag = true)
    private String level;
    @Column(name = "device_id", tag = true)
    private String deviceId;
    @Column(name = "msg")
    private String msg;
}

保存數(shù)據(jù)

以下代碼為單條日志保存,influxdb-java亦支持批量保存(因為與InfluxDB通訊均是通過http,因此建議批量保存以減少性能損耗).

?
1
2
3
4
5
6
7
8
9
10
11
12
LogInfo logInfo = LogInfo.builder()
    .level(jsonObject.getString("level"))
    .module(module)
    .deviceId(deviceId)
    .msg(jsonObject.getString("msg"))
    .build();
Point point = Point.measurementByPOJO(logInfo.getClass())
    .addFieldsFromPOJO(logInfo)
    .time(jsonObject.getLong("time"), TimeUnit.MILLISECONDS)
    .build();
// 出于業(yè)務(wù)考量,設(shè)備可以設(shè)置不同的保存策略(策略名為固定前綴+設(shè)備ID)
influxDB.write(influxDBUtils.database, InfluxDbUtils.policyNamePix + deviceId, point);

查詢數(shù)據(jù)

因為代碼與業(yè)務(wù)耦合比較厲害,因此此處僅截選做概要示范.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
// InfluxDB支持分頁查詢,因此可以設(shè)置分頁查詢條件
String pageQuery = " LIMIT " + request.getPageSize() + " OFFSET " + ((request.getPageNum() - 1) * request.getPageSize());
// 此處查詢所有內(nèi)容,如果
String queryCmd = "SELECT * FROM "
    // 查詢指定設(shè)備下的日志信息
    // 要指定從 RetentionPolicyName(保存策略前綴+設(shè)備ID).measurement(logInfo) 中查詢指定數(shù)據(jù))
    + InfluxDbUtils.policyNamePix + request.getDeviceId() + "." + "logInfo"
    // 添加查詢條件(注意查詢條件選擇tag值,選擇field數(shù)值會嚴(yán)重拖慢查詢速度)
    + queryCondition
    // 查詢結(jié)果需要按照時間排序
    + " ORDER BY time DESC"
    // 添加分頁查詢條件
    + pageQuery;

選擇時序數(shù)據(jù)庫,不建議使用刪除以及更新操作,因此不做介紹.

可以通過創(chuàng)建或者RetentionPolicy,來添加或者更新數(shù)據(jù)的刪除時間.

到此這篇關(guān)于Springboot使用influxDB時序數(shù)據(jù)庫的實現(xiàn)的文章就介紹到這了,更多相關(guān)Springboot使用influxDB內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://www.cnblogs.com/jason1990/p/11076310.html

延伸 · 閱讀

精彩推薦
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java實現(xiàn)搶紅包功能

    Java實現(xiàn)搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
主站蜘蛛池模板: 成人性爱视频在线观看 | 一级大黄毛片 | 久久综合九色综合久久久精品综合 | 懂色av懂色aⅴ精彩av | 免费毛片在线视频 | 国内精品伊人久久久久网站 | 国产午夜精品久久久久久免费视 | 日本aaa一级片 | 中文字幕一区2区 | 国产99久久精品一区二区 | 国产精品剧情一区二区在线观看 | 黄色免费小视频网站 | 国产乱一区二区三区视频 | 欧美精品v国产精品v日韩精品 | 黄色毛片观看 | 欧美成人一级片 | 一级片免费 | 国产88久久久国产精品免费二区 | 日本黄色免费播放 | 国产免费人做人爱午夜视频 | 成人富二代短视频 | 91,视频免费看 | 亚洲av毛片在线观看 | 激情久久免费视频 | 伦一区二区三区中文字幕v亚洲 | 亚洲射情 | av电影院在线观看 | 日本一道aⅴ不卡免费播放 日日草夜夜操 | 亚洲精品7777xxxx青睐 | 欧美性受xxxxxx黑人xyx性爽 | 欧美日韩国产中文字幕 | 国产系列 视频二区 | 亚洲午夜久久久久 | 毛片一级视频 | 中文字幕免费在线观看视频 | 久操免费在线视频 | 91真视频 | 国产中出在线观看 | 超久久 | 久久影院免费观看 | 国产无遮挡一区二区三区毛片日本 |