Mac安裝配置InfluxDB,InfluxDB快速入門,Java集成InfluxDB

1. 與MySQL的比較

InfluxDBMySQL解釋
BucketDatabase數據庫
MeasurementTable
TagIndexed Column索引列
FieldColumn普通列
PointRow每行數據

2. 安裝FluxDB

brew update

默認安裝 2.x的版本

brew install influxdb

查看influxdb版本

influxd version # InfluxDB 2.7.11 (git: fbf5d4ab5e) build_date: 2024-11-26T18:06:07Z

啟動influxdb

influxd

訪問面板

http://localhost:8086/

配置用戶信息
在這里插入圖片描述
保存token

L5IeK5vutRmkCuyzbz781GVKj4fR6fKGQdl3CaWAPNEKmigrI0Yt8IlEN5_qkO9Lgb80BpcISK0U4WSkWDcqIQ==

3. 使用行協議寫入數據

官網規范
在這里插入圖片描述

  • 首先是一個measurementName,和指定MySQL的表名一樣
  • 然后是Tag,和指定MySQL的索引列一樣,多個Tag通過逗號分隔
  • 然后是Field,和指定MySQL的普通列一樣多個Field通過逗號分隔,與Tag通過空格分隔
  • 最后是時間戳(選填,下面測試時單位為秒)

測試寫入:

user,name=jack age=11 1748264631

在這里插入圖片描述

結果:
在這里插入圖片描述

4. 使用Flux查詢數據

  • from:從哪個Bucket即桶中查詢數據
  • range:根據時間篩選數據,單位有ms毫秒,s秒,m分鐘,h消失,d天,w星期,mo月,y年,比如range(start: -1d, stop:now())就是過去一天內的數據,其中stop:now()是默認的,可以不寫。
  • filter:根據列篩選數據

樣例并解釋:

from(bucket: "demo") # 從demo這個數據庫中去數據|> range(start: -1d, stop:now()) # 時間范圍篩選|> filter(fn: (r) => r["_measurement"] == "user") # 從這個user這個表查詢數據|> filter(fn: (r) => r["name"] == "jack") # 根據索引等值查詢,相當于MySQL后面的where條件,influx會根據這個tag上的倒排索引加快查詢速度|> filter(fn: (r) => r["_field"] == "age") # 相當于MySQL查詢具體的列的數據,只不過有多個Field會被拆分為多行,每行對應一個Field的數據

關于r["_field"] == "age"的問題:為什么需要這么查詢?因為Field如果有多個,就會被拆成多行
比如我們插入數據時是這樣的:user,name=jack age=18,height=180 1716715200000000000,雖然這是一個數據點Point,但是由于有兩個Field,那么查詢到的數據其實是兩行,如果加了r["_field"] == "age",就只會出現第一條數據,注意Tag不會被拆分為多行

_measurementname_field_value_time
userjackage182024-05-26 00:00:00Z
userjackheight1802024-05-26 00:00:00Z

5. SpringBoot集成

5.1 引入依賴

<dependency><groupId>com.influxdb</groupId><artifactId>influxdb-client-java</artifactId><version>6.9.0</version>
</dependency>
<dependency><groupId>org.jetbrains.kotlin</groupId><artifactId>kotlin-stdlib</artifactId><version>1.8.20</version>
</dependency>

5.2. 插入數據

5.2.1 基礎數據

private final static String token = "L5IeK5vutRmkCuyzbz781GVKj4fR6fKGQdl3CaWAPNEKmigrI0Yt8IlEN5_qkO9Lgb80BpcISK0U4WSkWDcqIQ==";
private final static String org = "test";
private final static String bucket = "demo";
private final static String url = "http://127.0.0.1:8086";

5.2.2 通過行協議插入

private static void writeDataByLine() {InfluxDBClient influxDBClient = InfluxDBClientFactory.create(url, token.toCharArray());WriteApiBlocking writeApi = influxDBClient.getWriteApiBlocking();String data = "user,name=tom age=18 1748270504";writeApi.writeRecord(bucket, org, WritePrecision.S, data);
}

5.2.3 通過Point插入

private static void writeDataByPoint() {InfluxDBClient influxDBClient = InfluxDBClientFactory.create(url, token.toCharArray());WriteApiBlocking writeApi = influxDBClient.getWriteApiBlocking();Point point = Point.measurement("user").addTag("name", "jerry").addField("age", 20f).time(Instant.now(), WritePrecision.S);writeApi.writePoint(bucket, org, point);
}

5.2.4 通過Pojo類插入

import com.influxdb.annotations.Column;
import com.influxdb.annotations.Measurement;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;import java.time.Instant;@Measurement(name = "user")
@NoArgsConstructor
@AllArgsConstructor
public class InfluxData {@Column(tag = true)String name;@ColumnFloat age;@Column(timestamp = true)Instant time;
}
private static void writeDataByPojo() {InfluxDBClient influxDBClient = InfluxDBClientFactory.create(url, token.toCharArray());WriteApiBlocking writeApi = influxDBClient.getWriteApiBlocking();InfluxData influxData = new InfluxData("cat", 30f, Instant.now());writeApi.writeMeasurement(bucket, org, WritePrecision.S, influxData);
}

5.3 查詢數據

private static void queryData() {InfluxDBClient influxDBClient = InfluxDBClientFactory.create(url, token.toCharArray());String query = "from(bucket: \"demo\")\n" +"    |> range(start: -1d, stop:now())\n" +"    |> filter(fn: (r) => r[\"_measurement\"] == \"user\")";List<FluxTable> fluxTables = influxDBClient.getQueryApi().query(query, org);for (FluxTable fluxTable : fluxTables) {// 根據索引列分組for (FluxRecord record : fluxTable.getRecords()) { // 每組的數據System.out.println(record.getValues());}System.out.println();}
}

最終結果:
在這里插入圖片描述

5.4 查詢升級

自定義查詢參數,時間范圍查詢

@Data
public class InfluxDataQuery {private String plcName;@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime startTime;@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime stopTime;private String topic;
}
public List<Map<String, Object>> queryData(InfluxDataQuery queryParams) {String plcName = queryParams.getPlcName();LocalDateTime startTime = queryParams.getStartTime(), stopTime = queryParams.getStopTime();String topic = queryParams.getTopic();if (startTime == null) {throw new RuntimeException("startTime不能為空");}InfluxDBClient influxDBClient = InfluxDBClientFactory.create(url, token.toCharArray());StringBuilder sb = new StringBuilder();sb.append("\nfrom(bucket: \"").append(bucket).append("\")\n");if (stopTime == null) {stopTime = LocalDateTime.now();}sb.append("    |> range(start:").append(startTime.atOffset(ZoneOffset.UTC).format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)).append(",stop:").append(stopTime.atOffset(ZoneOffset.UTC).format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)).append(")\n");if (StringUtils.hasText(plcName)) {sb.append("    |> filter(fn: (r) => r[\"plcName\"] == \"").append(plcName).append("\")\n");}if (StringUtils.hasText(topic)) {sb.append("    |> filter(fn: (r) => r[\"_measurement\"] == \"").append(topic).append("\")\n");}log.info("query: {}", sb);List<FluxTable> fluxTables = influxDBClient.getQueryApi().query(sb.toString(), org);List<Map<String, Object>> dataList = new ArrayList<>();for (FluxTable fluxTable : fluxTables) {// 根據索引列分組for (FluxRecord record : fluxTable.getRecords()) { // 每組的數據dataList.add(record.getValues());}}return dataList;
}

拼接好的SQL大概長這樣子:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85103.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85103.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85103.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【spring】spring中的retry重試機制; resilience4j熔斷限流教程;springboot整合retry+resilience4j教程

在調用三方接口時&#xff0c;我們一般要考慮接口調用失敗的處理&#xff0c;可以通過spring提供的retry來實現&#xff1b;如果重試幾次都失敗了&#xff0c;可能就要考慮降級補償了&#xff1b; 有時我們也可能要考慮熔斷&#xff0c;在微服務中可能會使用sentinel來做熔斷&a…

(21)量子計算對密碼學的影響

文章目錄 2??1?? 量子計算對密碼學的影響 &#x1f30c;&#x1f50d; TL;DR&#x1f680; 量子計算&#xff1a;密碼學的終結者&#xff1f;? 量子計算的破壞力 &#x1f510; Java密碼學體系面臨的量子威脅&#x1f525; 受影響最嚴重的Java安全組件 &#x1f6e1;? 后…

經營分析會,財務該怎么做?

目錄 一、業績洞察&#xff1a;從「現象描述」到「因果分析」 1.分層拆解 2.關聯驗證 3.根因追溯 二、預算管理&#xff1a;從「剛性控制」到「動態平衡」 1.分類管控 2.滾動校準 3.價值評估 三、客戶與市場&#xff1a;從「交易記錄」到「價值評估」 1.價值分層 2.…

進階智能體實戰九、圖文需求分析助手(ChatGpt多模態版)(幫你生成 模塊劃分+頁面+表設計、狀態機、工作流、ER模型)

?? 基于 ChatGPT 多模態大模型的需求文檔分析助手 本文將介紹如何利用 OpenAI 的 GPT-4o 多模態能力,構建一個智能的需求文檔分析助手,自動提取功能模塊、菜單設計、字段設計、狀態機、流程圖和 ER 模型等關鍵內容。 一、?? 環境準備 在開始之前,請確保您已經完成了基礎…

圖書管理系統的設計與實現

湖南軟件職業技術大學 本科畢業設計(論文) 設計(論文)題目 圖書管理系統的設計與實現 學生姓名 學生學號 所在學院 專業班級 畢業設計(論文)真實性承諾及聲明 學生對畢業設計(論文)真實性承諾 本人鄭重聲明:所提交的畢業設計(論文)作品是本人在指導教師的指導下,獨…

直線模組在手術機器人中有哪些技術挑戰?

手術機器人在現代醫療領域發揮著越來越重要的作用&#xff0c;直線模組作為其關鍵部件&#xff0c;對手術機器人的性能有著至關重要的影響。然而&#xff0c;在手術機器人中使用直線模組面臨著諸多技術挑戰&#xff0c;具體如下&#xff1a; 1、?高精度要求?&#xff1a;手術…

技術-工程-管用養修保-智能硬件-智能軟件五維黃金序位模型

融智學工程技術體系&#xff1a;五維協同架構 基于鄒曉輝教授的框架&#xff0c;工程技術體系重構為&#xff1a;技術-工程-管用養修保-智能硬件-智能軟件五維黃金序位模型&#xff1a; math \mathbb{E}_{\text{技}} \underbrace{\prod_{\text{Dis}} \text{TechnoCore}}_{\…

InnoDB引擎邏輯存儲結構及架構

簡化理解版 想象 InnoDB 是一個高效運轉的倉庫&#xff1a; 核心內存區 (大腦 & 高速緩存 - 干活超快的地方) 緩沖池 Buffer Pool (最最核心&#xff01;)&#xff1a; 作用&#xff1a; 相當于倉庫的“高頻貨架”。把最常用的數據&#xff08;表數據、索引&#xff09;從…

貧血模型與充血模型:架構設計的分水嶺

在企業級應用的架構設計中&#xff0c;貧血模型和充血模型一直是架構師們爭論的熱點話題。兩者背后分別代表著“事務腳本模式”和“領域模型模式”兩種截然不同的設計思想。而理解這兩者的差異&#xff0c;有助于開發者根據實際業務場景做出更合理的架構決策。 貧血模型&#…

Linux的調試器--gbd/cgbd

1.引入 #include <stdio.h> int Sum(int s, int e) {int result 0;for(int i s; i < e; i){result i;}return result; } int main() {int start 1;int end 100;printf("I will begin\n");int n Sum(start, end);printf("running done, result i…

PPIO × AstrBot:多平臺接入聊天機器人,開啟高效協同 | 教程

在消息平臺接入專屬聊天機器人&#xff0c;能快速生成精準答案&#xff0c;與項目管理、CRM等系統集成后&#xff0c;機器人還能根據任務進展自動建群、推送進度提醒&#xff0c;并精準相關人員&#xff0c;實現信息的高效傳遞。 AstrBot 是一個多平臺聊天機器人及開發框架&…

HAProxy 可觀測性最佳實踐

HAProxy 簡介 HAProxy&#xff08;High Availability Proxy&#xff09;是一款廣泛使用的高性能負載均衡器&#xff0c;支持 TCP 和 HTTP 協議&#xff0c;提供高可用性、負載均衡和代理服務。它特別適用于負載較大的 Web 站點&#xff0c;能夠支持數以萬計的并發連接&#xf…

增強LangChain交互體驗:消息歷史(記憶)功能詳解

背景 在構建聊天機器人時,將對話狀態傳入和傳出鏈至關重要。 LangGraph 實現了內置的持久層,允許鏈狀態自動持久化在內存或外部后端(如 SQLite、Postgres 或 Redis)中。在本文我們將演示如何通過將任意 LangChain runnables 包裝在最小的 LangGraph 應用程序中來添加持久性…

EasyRTC音視頻實時通話助力微信小程序:打造低延遲、高可靠的VoIP端到端呼叫解決方案

一、方案概述? 在數字化通信浪潮下&#xff0c;端到端實時音視頻能力成為剛需。依托龐大用戶生態的微信小程序&#xff0c;是實現此類功能的優質載體。基于WebRTC的EasyRTC音視頻SDK&#xff0c;為小程序VoIP呼叫提供輕量化解決方案&#xff0c;通過技術優化實現低延遲通信&a…

WebVm:無需安裝,一款可以在瀏覽器運行的 Linux 來了

WebVM 是一款可以在瀏覽器中運行的Linux虛擬機。不是那種HTMLJavaScript模擬的UI&#xff0c;完全通過HTML5/WebAssembly技術實現客戶端運行。通過集成CheerpX虛擬化引擎&#xff0c;可直接在瀏覽器中運行未經修改的Debian系統。 Stars 數13054Forks 數2398 主要特點 完整 Lin…

CesiumInstancedMesh 實例

CesiumInstancedMesh 實例 import * as Cesium from cesium;// Three.js 風格的 InstancedMesh 類, https://threejs.org/docs/#api/en/objects/InstancedMesh export class CesiumInstancedMesh {/*** Creates an instance of InstancedMesh.** param {Cesium.Geometry} geom…

創建型模式之Abstract Factory(抽象工廠)

創建型模式之Abstract Factory&#xff08;抽象工廠&#xff09; 摘要&#xff1a; 本文介紹了抽象工廠模式&#xff08;Abstract Factory&#xff09;&#xff0c;它是一種創建型設計模式&#xff0c;提供了一種創建一系列相關對象的接口而無需指定具體類。文章通過手機工廠示…

多卡訓練核心技術詳解

多卡訓練核心技術詳解 多卡訓練 主要圍繞分布式環境初始化、模型并行化、數據分片和梯度同步展開。下面結合您的代碼,詳細解釋這些核心部分: 并行執行命令 torchrun --nproc_per_node=5 TokenLossMulCard.py 1. 分布式環境初始化 def init_distributed():init_process_…

OpenCV---minAreaRect

一、基本概念與用途 minAreaRect是OpenCV中用于計算點集的最小面積旋轉矩形的函數。在計算機視覺領域&#xff0c;它常被用于&#xff1a; 目標檢測中獲取傾斜對象的邊界框&#xff08;如傾斜的車牌、文本行、工業零件&#xff09;形狀分析與識別&#xff08;如確定物體的主方…

高端裝備制造企業如何選擇適配的項目管理系統提升項目執行效率?附選型案例

高端裝備制造項目通常涉及多專業協同、長周期交付和高風險管控&#xff0c;因此系統需具備全生命周期管理能力。例如&#xff0c;北京奧博思公司出品的 PowerProject 項目管理系統就是一款非常適合制造企業使用的項目管理軟件系統。 國內某大型半導體裝備制造企業與奧博思軟件達…