SpringBoot操作InfluxDb數據庫

一、InfluxDb數據庫簡介

InfluxDb用Go語言編寫的一個開源分佈式時序、事件和指標數據庫,和傳統是數據庫相比有不少不同的地方。

類似的數據庫有Elasticsearch、Graphite等。

1.提供了Http接口的API來操作數據

2.提供了類似sql的數據庫語句

3.不支持數組保存

4.influxdb中的一條記錄point主要可以分爲三類,必須存在的time(時間),string類型的tag,以及其他成員field;而series則是一個measurement中保存策略和tag集構成,Measurement相當於關係型數據的表。

二、InfluxDb保存策略

1、默認是不刪除,保存策略永久

> SHOW RETENTION POLICIES ON telegraf

name    duration    shardGroupDuration    replicaN    default

default    0           168h0m0s               1        true

可以看到,telegraf只有一個策略,各字段的含義如下:

name--名稱,此示例名稱爲 default

duration--持續時間,0代表無限制

shardGroupDuration--shardGroup的存儲時間,shardGroup是InfluxDB的一個基本儲存結構,應該大於這個時間的數據在查詢效率上應該有所降低。

replicaN--全稱是REPLICATION,副本個數

default--是否是默認策略

  1. 可以新建策略

CREATE RETENTION POLICY "2_hours" ON "telegraf" DURATION 2h REPLICATION 1 DEFAULT

> SHOW RETENTION POLICIES ON telegraf

name    duration    shardGroupDuration    replicaN    default

default    0        168h0m0s        1        false

2_hours    2h0m0s        1h0m0s            1        true

 

  1. 修改策略

> ALTER RETENTION POLICY "2_hours" ON "telegraf" DURATION 4h DEFAULT

> show retention POLICIES on telegraf

name    duration    shardGroupDuration    replicaN    default

default    0        168h0m0s        1        false

2_hours    4h0m0s        1h0m0s            1        true

 

  1. 刪除策略

> drop retention POLICY "2_hours" ON "telegraf"

> show retention POLICIES on telegraf

name    duration    shardGroupDuration    replicaN    default

default    0        168h0m0s        1        false

 

  • 測試結果

插入數據測試工具:https://github.com/influxdata/influx-stress

讀取數據測試工具:https://github.com/influxdata/influxdb-comparisons

分頁查詢語句:  SELECT time,Field列 FROM measurement WHERE 時間範圍 LIMIT rows OFFSET (page - 1)*rows

 

查詢性能:平均每秒執行600次。

插入性能:平均每秒10w次。 

 

  • Java代碼

1.maven的jar包依賴

<dependency>
   <groupId>org.influx

		<dependency>
			<groupId>org.influxdb</groupId>
			<artifactId>influxdb-java</artifactId>
			<version>2.15</version>
		</dependency>

r2.properties文件配置

spring.influx.url=http://127.0.0.1:8086
spring.influx.user=root
spring.influx.password=root

3.插入代碼

經個人測試,InfluxDB的列的排列順序是按照英文字母先後順序排列的,time除外,time排第一位,其他按照英文字母先後順序依次排列

Point.Builder b

3.uilder = Point.measurement("testDatas");
builder.time(Sys

@GetMapping(value = "addTestDatas")
    public void insert() {
        Point.Builder builder = Point.measurement("testDatas");
        builder.time(System.currentTimeMillis(),TimeUnit.MICROSECONDS);
        builder.addField("label","測試標籤");
        builder.addField("type",2);
        builder.addField("data","東經30度,北緯38度,天氣晴");
        builder.addField("equipmentId", UUID.randomUUID().toString());
        builder.addField("alarm", false);

        StringBuilder sb = new StringBuilder(UUID.randomUUID().toString());
        for (int i = 0; i < 30; i++) {
            sb.append(UUID.randomUUID().toString()).append(",");
        }

        builder.addField("systemModelIds", sb.toString().substring(0, sb.toString().length() - 1));

        builder.tag("cpuid","666888");
        builder.tag("cputype","F");
        Point point = builder.build();
        influxDB.setDatabase("testdb").write(point);

    }

t4.查詢代碼

SString command = "select * from testDatas";
Query query = new Query(command,"testdb");

// QueryResul

@GetMapping("/queryTestData")
    public String testQuery() {
        String command = "select * from testDatas";
        Query query = new Query(command,"testdb");

        // QueryResult queryResult = influxDB.query(query);
        QueryResult queryResult = influxDB.query(query, TimeUnit.MILLISECONDS);

        List<QueryResult.Result> results = queryResult.getResults();
        if (results == null) {
            return null;
        }
        // 多個sql用分號隔開,因本次查詢只有一個sql,所以取第一個就行
        QueryResult.Result result = results.get(0);
        List<QueryResult.Series> seriesList = result.getSeries();
        List<MeasuringPointData> tests = new LinkedList<>();

        for (QueryResult.Series series : seriesList) {
            if (series == null) {
                return null;
            }
            System.out.println("colums ==>> " + JSON.toJSON(series.getColumns()));
            System.out.println("tags ==>> " + JSON.toJSON(series.getTags()));
            System.out.println("name ==>> " + JSON.toJSON(series.getName()));
            System.out.println("values ==>> " + JSON.toJSON(series.getValues()));
            System.out.println("查詢總數爲: ==>> " + (series.getValues() == null ? 0 : series.getValues().size()));

            List<MeasuringPointData> dataVos = new LinkedList<>();
            series.getValues().forEach(testData -> {
                MeasuringPointData dataVo = new MeasuringPointData();

                // 直接查詢出來的是科學計數法,需要轉換爲Long類型的數據
                BigDecimal decimalTime = new BigDecimal(testData.get(0).toString());
                dataVo.setTime(decimalTime.longValue());
                dataVo.setAlarm((boolean) testData.get(1));
                dataVo.setData(testData.get(4).toString());
                dataVo.setEquipmentId(testData.get(5).toString());
                dataVo.setLabel(testData.get(6).toString());
                System.out.println("長度信息==>> " + testData.get(7).toString().length());
                dataVo.setSystemModelIds(Arrays.asList(StringUtils.split(testData.get(7).toString(), "\\,")));
                dataVo.setType(Double.valueOf(testData.get(8).toString()).intValue());

                System.out.println("數組長度==>> " +dataVo.getSystemModelIds().size());

                dataVos.add(dataVo);
            });

            System.out.println("最終結果爲: " + JSON.toJSON(dataVos));
            tests = dataVos;
        }

        return JSON.toJSONString(tests);
    }

t queryResult = influxDB.query(query);
文檔地址

https://docs.influxdata.com/influxdb/v1.7/troubleshooting/frequently-asked-questions/

 

  • 插入及查詢語句
  1. 查詢語句:

InfluxDb語句類傳統數據庫語句,支持order by, limit分頁查詢及where語句等。

以下是模糊查詢示例(包含某個信息)

SELECT * FROM "testDatas" WHERE systemModelIds =~ /e2703312-49ec-4285-9efd-3e30fe8ad8e0/

①.實現查詢以給定字段開始的數據

 

select fieldName from measurementName where fieldName=~/^給定字段/

 

②.實現查詢以給定字段結束的數據

 

select fieldName from measurementName where fieldName=~/給定字段$/

 

③.實現查詢包含給定字段數據

 

select fieldName from measurementName where fieldName=~/給定字段/

發佈了33 篇原創文章 · 獲贊 12 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章