使用SpringBoot+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)控指標等。
特點:
- 采用 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 服務器地址 token: _7FZlXGJJcd8Ayox-F-hVBDdXb_a5SI3530x1DdFKZfQ65uOhnpQciJWHpd7ULhpAOcgj5oV2JsR-Xf0qTtAxg== org: xxx # 組織名稱 bucket: xxx # 存儲桶名稱 # InfluxDB 客戶端日志級別 # ERROR: 僅記錄錯誤日志 # WARN: 記錄警告和錯誤日志 # INFO: 記錄普通信息、警告和錯誤日志 # DEBUG: 記錄調(diào)試級別的詳細日志 # BODY: 記錄完整的 HTTP 請求和響應主體 # 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()) // 添加標簽(索引)
.addField("value", temperatureDTO.getValue()) // 添加字段(數(shù)據(jù))
.time(Instant.now(), WritePrecision.NS); // 記錄當前時間戳
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")); // 獲取標簽信息
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提取 標簽 + 字段 數(shù)據(jù)
6、Controller 層:API 設計
@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)文章
Spring線程池ThreadPoolExecutor配置并且得到任務執(zhí)行的結(jié)果
今天小編就為大家分享一篇關(guān)于Spring線程池ThreadPoolExecutor配置并且得到任務執(zhí)行的結(jié)果,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03
Java數(shù)據(jù)結(jié)構(gòu)之實現(xiàn)哈希表的分離鏈接法
今天給大家?guī)淼氖顷P(guān)于Java數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識,文章圍繞著Java哈希表的分離鏈接法展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06
使用Java實現(xiàn)HTTP和HTTPS代理服務詳解
這篇文章主要為大家詳細介紹了如何使用Java實現(xiàn)HTTP和HTTPS代理服務,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2024-04-04
Springboot集成Sentinel?組件實現(xiàn)基本限流功能(快速入門)
Sentinel是阿里巴巴開發(fā)的面向云原生微服務的高可用流控防護組件,支持流量控制、熔斷降級、系統(tǒng)負載保護等多維度防護,適用于秒殺、消息削峰填谷等場景,本文給大家介紹Springboot集成Sentinel組件實現(xiàn)基本限流功能,感興趣的朋友跟隨小編一起看看吧2025-12-12
Java開發(fā)中POJO和JSON互轉(zhuǎn)時如何忽略隱藏字段的問題
這篇文章主要介紹了Java開發(fā)中POJO和JSON互轉(zhuǎn)時如何忽略隱藏字段的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02
使用AOP攔截Controller獲取@PathVariable注解傳入的參數(shù)
這篇文章主要介紹了使用AOP攔截Controller獲取@PathVariable注解傳入的參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
Java實現(xiàn)經(jīng)典游戲俄羅斯方塊(升級版)的示例代碼
俄羅斯方塊是一款風靡全球,從一開始到現(xiàn)在都一直經(jīng)久不衰的電腦、手機、掌上游戲機產(chǎn)品,是一款游戲規(guī)則簡單,但又不缺乏樂趣的簡單經(jīng)典小游戲。本文將用Java語言實現(xiàn)這一經(jīng)典游戲,需要的可以參考一下2022-09-09

