最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用SpringBoot+InfluxDB實現(xiàn)高效數(shù)據(jù)存儲與查詢

 更新時間:2025年08月17日 11:41:44   作者:火皇405  
InfluxDB 是一個開源的時間序列數(shù)據(jù)庫,特別適合處理帶有時間戳的監(jiān)控數(shù)據(jù)、指標(biāo)數(shù)據(jù)等,下面詳細介紹如何在 Spring Boot 項目中集成 InfluxDB 實現(xiàn)高效數(shù)據(jù)存儲與查詢功能,需要的朋友可以參考下

1、項目介紹

本項目使用 Spring Boot + InfluxDB 2.x 來存儲和查詢時間序列數(shù)據(jù),適用于 物聯(lián)網(wǎng)(IoT)、實時監(jiān)控、日志分析 等場景。

2、 InfluxDB 介紹

InfluxDB 是一個高性能的時間序列數(shù)據(jù)庫(TSDB),適用于存儲溫度、傳感器數(shù)據(jù)、日志、監(jiān)控指標(biāo)等。

特點

  • 采用 Flux 查詢語言
  • 高吞吐量,支持 批量寫入
  • Tag(索引)+ Field(數(shù)據(jù)) 結(jié)構(gòu),提高查詢效率
  • 精確時間戳(支持納秒級)

3、Spring Boot 配置 InfluxDB

application.yml 中配置 InfluxDB 連接:

# InfluxDB 獨立配置
influxdb:
  url: http://192.168.1.1xx:28086/  # InfluxDB 服務(wù)器地址
  token: _7FZlXGJJcd8Ayox-F-hVBDdXb_a5SI3530x1DdFKZfQ65uOhnpQciJWHpd7ULhpAOcgj5oV2JsR-Xf0qTtAxg==
  org: xxx     # 組織名稱
  bucket: xxx  # 存儲桶名稱
  # InfluxDB 客戶端日志級別
  # ERROR: 僅記錄錯誤日志
  # WARN: 記錄警告和錯誤日志
  # INFO: 記錄普通信息、警告和錯誤日志
  # DEBUG: 記錄調(diào)試級別的詳細日志
  # BODY: 記錄完整的 HTTP 請求和響應(yīng)主體
  # TRACE: 記錄極其詳細的跟蹤日志
  # ALL: 記錄所有日志級別(視客戶端而定)
  logLevel: BODY

4、InfluxDB 連接配置

InfluxDBConfig.java 中配置 InfluxDB 客戶端:

import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.InfluxDBClientFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class InfluxDBConfig {
 
    @Value("${influxdb.url}")
    private String url;
 
    @Value("${influxdb.token}")
    private String token;
 
    @Value("${influxdb.org}")
    private String org;
 
    @Value("${influxdb.bucket}")
    private String bucket;
 
    @Bean
    public InfluxDBClient influxDBClient() {
        return InfluxDBClientFactory.create(url, token.toCharArray(), org, bucket);
    }
}

說明

  • InfluxDBClientFactory.create(url, token, org, bucket) 創(chuàng)建 InfluxDB 客戶端
  • @Value 讀取 application.yml 配置

5、Service 層:數(shù)據(jù)寫入 & 查詢

5.1 單條數(shù)據(jù)寫入

public void writeSingleData(TemperatureDTO temperatureDTO) {
    WriteApiBlocking writeApi = influxDBClient.getWriteApiBlocking();
    
    Point point = Point.measurement("temperature")
            .addTag("location", temperatureDTO.getLocation()) // 添加標(biāo)簽(索引)
            .addField("value", temperatureDTO.getValue()) // 添加字段(數(shù)據(jù))
            .time(Instant.now(), WritePrecision.NS); // 記錄當(dāng)前時間戳
 
    writeApi.writePoint(point);
}

5.2 批量寫入(異步)

public void writeBatchData(List<TemperatureDTO> temperatureDTOs) {
    WriteApi writeApi = influxDBClient.makeWriteApi(); // 獲取異步 API
 
    List<Point> points = temperatureDTOs.stream()
            .map(dto -> Point.measurement("temperature")
                    .addTag("location", dto.getLocation())
                    .addField("value", dto.getValue())
                    .time(Instant.now(), WritePrecision.NS))
            .collect(Collectors.toList());
 
    CompletableFuture<Void> future = CompletableFuture.runAsync(() -> writeApi.writePoints(points));
    future.whenComplete((result, error) -> {
        if (error != null) {
            System.err.println("?? 寫入失?。? + error.getMessage());
        } else {
            writeApi.close();  // 關(guān)閉 API 避免資源泄露
            log.info("? 批量數(shù)據(jù)寫入成功(異步)");
        }
    });
}

說明

  • 異步寫入 不會阻塞主線程,提高吞吐量
  • 異?;卣{(diào) 捕獲寫入失敗的信息
  • 使用 writeApi.close() 避免資源泄露

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

public List<TemperatureVO> queryTemperatureData() {
    String query = "from(bucket: \"test\") |> range(start: -1h)";
    QueryApi queryApi = influxDBClient.getQueryApi();
 
    return queryApi.query(query)
            .stream()
            .flatMap(fluxTable -> fluxTable.getRecords().stream()) // 遍歷 FluxTable
            .map(record -> {
                TemperatureVO vo = new TemperatureVO();
                vo.setLocation((String) record.getValueByKey("location")); // 獲取標(biāo)簽信息
                Object valueObj = record.getValueByKey("_value");
                vo.setValue(valueObj != null ? ((Number) valueObj).doubleValue() : 0.0);
                vo.setTimestamp(record.getTime().toString());
                return vo;
            })
            .collect(Collectors.toList());
}

說明

  • Flux 查詢 過去 1h 內(nèi)的數(shù)據(jù)
  • 遍歷 FluxTable 提取 標(biāo)簽 + 字段 數(shù)據(jù)

6、Controller 層:API 設(shè)計

@RestController
@RequestMapping("/api/influxdb")
public class InfluxDBController {
 
    @Autowired
    private TestService influxDBService;
 
    @PostMapping("/write")
    public String writeData(@RequestBody TemperatureDTO temperatureDTO) {
        influxDBService.writeSingleData(temperatureDTO);
        return "? 單條數(shù)據(jù)寫入成功!";
    }
 
    @PostMapping("/write-batch")
    public String writeBatchData() {
        List<TemperatureDTO> data = generateTestData(10000);
        influxDBService.writeBatchData(data);
        return "? 10,000 條數(shù)據(jù)成功寫入!";
    }
 
    @GetMapping("/query")
    public List<TemperatureVO> queryTemperatureData() {
        return influxDBService.queryTemperatureData();
    }
 
    private List<TemperatureDTO> generateTestData(int count) {
        List<TemperatureDTO> dataList = new ArrayList<>();
        Random random = new Random();
        for (int i = 0; i < count; i++) {
            TemperatureDTO dto = new TemperatureDTO();
            dto.setLocation("office-" + (random.nextInt(1000) + 1));
            dto.setValue(15 + (random.nextDouble() * 10));
            dataList.add(dto);
        }
        return dataList;
    }
}

說明

  • /write ? 單條寫入
  • /write-batch ? 生成 10,000 條數(shù)據(jù)并寫入
  • /query ? 查詢過去 1 小時數(shù)據(jù)

7、運行 & 測試

7.1 啟動項目

mvn spring-boot:run 

7.2 使用 Postman 進行測試

1、寫入單條數(shù)據(jù)

POST http://localhost:8080/api/influxdb/write

{
  "location": "office-1",
  "value": 22.5
}

2、批量寫入

POST http://localhost:8080/api/influxdb/write-batch

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

GET http://localhost:8080/api/influxdb/query

以上就是使用SpringBoot+InfluxDB實現(xiàn)高效數(shù)據(jù)存儲與查詢的詳細內(nèi)容,更多關(guān)于SpringBoot InfluxDB數(shù)據(jù)存儲與查詢的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

庆城县| 通江县| 大方县| 巴林右旗| 会东县| 昌图县| 墨玉县| 阳山县| 吴桥县| 汉沽区| 石狮市| 安图县| 舒兰市| 平湖市| 谢通门县| 河源市| 泗洪县| 都安| 炉霍县| 固安县| 怀来县| 墨脱县| 思茅市| 美姑县| 石城县| 桑植县| 额敏县| 星子县| 四会市| 阿克陶县| 南乐县| 漯河市| 栾川县| 日照市| 方城县| 闸北区| 渑池县| 大同市| 蒲江县| 开原市| 策勒县|