主頁 > 後端開發 > Docker安裝InfluxDB1.x和InfluxDB2.x以及與SpringBoot整合

Docker安裝InfluxDB1.x和InfluxDB2.x以及與SpringBoot整合

2022-01-22 06:13:01 後端開發

兩者區別:

1.x 版本使用 influxQL 查詢語言,2.x 和 1.8+(beta) 使用 flux 查詢語法;相比V1 移除了database 和 RP,增加了bucket,
V2具有以下幾個概念:
timestamp、field key、field value、field set、tag key、tag value、tag set、measurement、series、point、bucket、bucket schema、organization
新增的概念:
bucket:所有 InfluxDB 資料都存盤在一個存盤桶中,一個桶結合了資料庫的概念和存盤周期(時間每個資料點仍然存在持續時間),一個桶屬于一個組織
bucket schema:具有明確的schema-type的存盤桶需要為每個度量指定顯式架構,測量包含標簽、欄位和時間戳,顯式模式限制了可以寫入該度量的資料的形狀,
organization:InfluxDB組織是一組用戶的作業區,所有儀表板、任務、存盤桶和用戶都屬于一個組織,
本文所有代碼:https://github.com/Tom-shushu/InfluxDB1.xAnd2.x-SpringBoot 新得閱讀地址:http://www.zhouhong.icu/post/161

一、InfluxDB1.x Docker安裝以及與Boot整合

A、docker安裝InfluxDB1.x (influxdb1.8.4)
1、安裝:
docker run -d  --name influxdb -p 8086:8086 influxdb:1.8.4 
2、查看

docker ps -a
3、進入docker的influx中
docker exec -it daf88772adc9 /bin/bash
4、直接輸入influx啟動
influx
5、修改賬戶密碼
# 顯示用戶
SHOW USERS
# 創建用戶
CREATE USER "username" WITH PASSWORD 'password'
# 賦予用戶管理員權限
GRANT ALL PRIVILEGES TO username
# 創建管理員權限的用戶
CREATE USER <username> WITH PASSWORD '<password>' WITH ALL PRIVILEGES
# 修改用戶密碼
SET PASSWORD FOR username = 'password'
# 撤消權限
REVOKE ALL ON mydb FROM username
# 查看權限
SHOW GRANTS FOR username
# 洗掉用戶
DROP USER "username"

6、在組態檔啟用認證
默認情況下,influxdb的組態檔是禁用認證策略的,所以需要修改設定一下, 編輯組態檔vim /etc/influxdb/influxdb.conf,把 [http] 下的 auth-enabled 選項設定為 true
7、設定保存策略(多長時間之前的資料需要洗掉)---默認為 autogen 永久不洗掉
a、查看資料庫的保存策略
show retention policies on 資料庫名
例子:
# 選擇使用telegraf資料庫
> use influx_test;
Using database influx_test
# 查詢資料保存策略
> show retention policies on influx_test
name    duration shardGroupDuration replicaN default
----    -------- ------------------ -------- -------
autogen 0s       168h0m0s           1        true

name 策略名稱:默認autogen duration 持續時間: 0s 代表無限制 shardGroupDuration shardGroup資料存盤時間:shardGroup是InfluxDB的一個基本存盤結構, 應該大于這個時間的資料在查詢效率上應該有所降低, replicaN 副本個數:1 代表只有一個副本 default 是否默認策略:true 代表設定為該資料庫的默認策略
b、設定保存策略
# 新建一個策略
CREATE RETENTION POLICY "策略名稱" ON 資料庫名 DURATION 時長 REPLICATION 副本個數;
# 新建一個策略并且直接設定為默認策略
CREATE RETENTION POLICY "策略名稱" ON 資料庫名 DURATION 時長 REPLICATION 副本個數 DEFAULT;
例子:
# 創建新的默認策略role_01保留資料時長1小時
> CREATE RETENTION POLICY "1hour" ON influx_test DURATION 1h REPLICATION 1 DEFAULT;
c、修改保存策略

ALTER RETENTION POLICY "策略名稱" ON "資料庫名" DURATION 時長
ALTER RETENTION POLICY "策略名稱" ON "資料庫名" DURATION 時長 DEFAULT
d、洗掉保存策略

drop retention POLICY "策略名" ON "資料庫名"
8、使用桌面可視化工具連接資料庫
工具鏈接:https://github.com/CymaticLabs/InfluxDBStudio/releases/download/v0.2.0-beta.1/InfluxDBStudio-0.2.0.zip

如果剛才沒有設定密碼,這里可以不需要填寫密碼,如果有賬號密碼則需要勾上下面的Use SSL 連接成功后如下:

B、InfluxDB1.x與Spring整合(只列舉部分代碼,后面會放上整個專案的GitHub地址)
整個專案結構如下:

1、引入依賴 (其他依賴未顯示全,后面會放上整個專案的GitHub地址)

<dependency>
    <groupId>com.influxdb</groupId>
    <artifactId>influxdb-client-java</artifactId>
    <version>4.0.0</version>
</dependency>
<dependency>
    <groupId>org.influxdb</groupId>
    <artifactId>influxdb-java</artifactId>
    <version>2.20</version>
</dependency>
2、新建yml檔案

influx:
  url: 'http://xxx.xx.xxx.xx:8086'
  password: 'password'
  username: 'username'
3、連接配置 InfluxDBConfig

@Data
@Configuration
@ConfigurationProperties(prefix = "influx")
public class InfluxDBConfig {
    private String url;
    private String username;
    private String password;
    /**
      * description: 用于查詢
      * date: 2022/1/20 23:11
      * author: zhouhong
      * @param  * @param null
      * @return
      */
    @Bean(destroyMethod = "close")
    public InfluxDB influxDBClient(){
        return InfluxDBFactory.connect(this.url, this.username, this.password);
    }
    /**
      * description: 用于寫入
      * date: 2022/1/20 23:12
      * author: zhouhong
      * @param  * @param null
      * @return
      */
    @Bean(name = "influxDbWriteApi",destroyMethod = "close")
    public WriteApi influxDbWriteApi(){
        InfluxDBClient influxDBClient = InfluxDBClientFactory.createV1(this.url, this.username,
                this.password.toCharArray(), "influx_test", "autogen");
        return influxDBClient.getWriteApi();
    }
}
4、封裝用于查詢的方法

@Component
public class InfluxUtil {
    /**
      * description: 通用查詢
      * date: 2022/1/20 23:13
      * author: zhouhong
      * @param  * @param null
      * @return
      */
    public QueryResult query(String command, String database, InfluxDB influxDB) {
        Query query = new Query(command, database);
        return influxDB.query(query);
    }
}
5、新建需要寫入的資料的物體類、需要回傳的類(省略,具體參考github示例)InsertParams.java InfluxResult.java
6、新建server層和impl實作類
InfluxServiceImpl.java 如下:

/**
  * description: 時序資料庫Impl
  * date: 2022/1/16 20:47
  * author: zhouhong
  */
@Service
@Slf4j
public class InfluxServiceImpl implements InfluxService {
    @Resource(name = "influxDbWriteApi")
    private WriteApi influxDbWriteApi;
    @Resource(name = "influxDBClient")
    private InfluxDB influxDBClient;
    @Autowired
    private InfluxUtil influxUtil;
    @Override
    public void insert(InsertParams insertParams) {
        influxDbWriteApi.writeMeasurement(WritePrecision.MS, insertParams);
    }
    @Override
    public Object queryAll(InsertParams insertParams) {
        List<InfluxResult> list = new ArrayList<>();
        InfluxResult influxResult = new InfluxResult();
        String sql = "SELECT * FROM \"influx_test\" WHERE time > '2022-01-16'  tz('Asia/Shanghai')";
        QueryResult queryResult = influxUtil.query(sql, "influx_test", influxDBClient);
        queryResult.getResults().get(0).getSeries().get(0).getValues().forEach(item -> {
            influxResult.setTime(item.get(0).toString());
            influxResult.setCurrent(item.get(1).toString());
            influxResult.setEnergyUsed(item.get(2).toString());
            influxResult.setPower(item.get(3).toString());
            influxResult.setVoltage(item.get(4).toString());
            list.add(influxResult);
        });
        return list;
    }
    @Override
    public Object querySumByOneDay(InsertParams insertParams) {
        String sql = "SELECT  SUM(voltage)  FROM \"influx_test\" WHERE time > '2022-01-18'  GROUP BY time(1d)  tz('Asia/Shanghai')";
        QueryResult queryResult = influxUtil.query(sql, "influx_test", influxDBClient);
        return queryResult.getResults().get(0).getSeries().get(0);
    }
}
7、controller層 InfluxDbController.java(回傳結果是封裝過后的,詳情見github示例)

@RestController
public class InfluxDbController {
    @Autowired
    private InfluxService influxService;
    /**
      * description: 時序資料庫插入測驗
      * date: 2022/1/16 23:00
      * author: zhouhong
      * @param  * @param null
      * @return
      */
    @PostMapping("/influxdb/insert")
    public ResponseData insert(@RequestBody InsertParams insertParams) {
        influxService.insert(insertParams);
        return new SuccessResponseData();
    }
    /**
     * description: 時序資料庫查詢全部資料測驗
     * date: 2022/1/16 23:00
     * author: zhouhong
     * @param  * @param null
     * @return
     */
    @PostMapping("/influxdb/queryAll")
    public ResponseData query(@RequestBody InsertParams insertParams) {
        return new SuccessResponseData(influxService.queryAll(insertParams));
    }
    /**
     * description: 時序資料庫按天查詢當前電壓總和測驗
     * date: 2022/1/16 23:00
     * author: zhouhong
     * @param  * @param null
     * @return
     */
    @PostMapping("/influxdb/queryByOneDay")
    public ResponseData queryByOneDay(@RequestBody InsertParams insertParams) {
        return new SuccessResponseData(influxService.querySumByOneDay(insertParams));
    }
}
8、PostMan測驗(注意需要先新建一個 資料庫---influx_test)
8.1 插入測驗 localhost:9998/influxdb/insert
入參:

{
    "energyUsed":243.78,
    "power":54.50,
    "current":783.34,
    "voltage":44.09
}
回傳:

{
    "success": true,
    "code": 200,
    "message": "請求成功",
    "localizedMsg": "請求成功",
    "data": null
}
8.2、查詢全部(注意,這里回傳結果我封裝了一下)localhost:9998/influxdb/queryAll
入參:

{
}
回傳:

{
    "success": true,
    "code": 200,
    "message": "請求成功",
    "localizedMsg": "請求成功",
    "data": [
        {
            "energyUsed": "243.78",
            "power": "54.5",
            "current": "783.34",
            "voltage": "44.09",
            "time": "2022-01-20T23:44:00.626+08:00"
        },
        {
            "energyUsed": "243.78",
            "power": "54.5",
            "current": "783.34",
            "voltage": "44.09",
            "time": "2022-01-20T23:44:00.626+08:00"
        }
    ]
}
8.3聚合查詢(統計2022-01-18到現在,以天為單位每天的用電量之和) localhost:9998/influxdb/queryByOneDay 精度問題暫時沒處理
入參:
{ }
回傳:

{
    "success": true,
    "code": 200,
    "message": "請求成功",
    "localizedMsg": "請求成功",
    "data": {
        "name": "influx_test",
        "tags": null,
        "columns": [
            "time",
            "sum"
        ],
        "values": [
            [
                "2022-01-18T00:00:00+08:00",
                null
            ],
            [
                "2022-01-19T00:00:00+08:00",
                null
            ],
            [
                "2022-01-20T00:00:00+08:00",
                481.07000000000005
            ]
        ]
    }
}
C、常見的查詢SQL 后面加上 tz('Asia/Shanghai') 解決時區差
1、查所指定時間之后的所有

SELECT * FROM "real_water_amount" where time  > '2022-01-01' tz('Asia/Shanghai')

2、查詢平均值 mean()

SELECT mean(value) FROM "real_water_amount" where time  > '2022-01-01' tz('Asia/Shanghai')

3、查詢最大最小值 max() min()

SELECT max(value) FROM "real_water_amount" where time  > '2022-01-01' tz('Asia/Shanghai')

4、按年、月、天、周、小時、分鐘、秒統計

SELECT sum(value) FROM "real_water_amount" where time  > '2022-01-01'  group by time(1d)  tz('Asia/Shanghai')

5、按照列過濾

SELECT * FROM "real_water_amount" where time  > '2022-01-01'   and  iotId = '8ecJY59UJd1jwPLBmJA5000000'

二、InfluxDB2.x Docker安裝以及與Boot整合

A、Docker安裝InfluxDB2.x
1、安裝:默認拉取最新版本
docker run -d --name influxdb -p 8086:8086 influxdb
2、查看
docker ps -a
3、瀏覽器訪問 IP:8086 (注意:部署在遠程服務器上需要開啟8086埠安全組)設定賬號密碼

從上到下為:賬號(zhouhong)、密碼(66668888)、確認密碼(66668888)、組織(my_influxdb)、Buucket(Tom);完了之后點擊 Quick Start
4、然后點擊 Data -- > Buucket 就可以看到我們剛才創建的 名字為 Tom 的 Buucket了

5、點擊 API Tokens 獲取當前用戶的 Token(整合時需要)

6、設定Bucket的保存策略

準備作業完成,開始整合
B、InfluxDB2.x與SpringBoot整合
1、依賴

<dependency>
    <groupId>com.influxdb</groupId>
    <artifactId>influxdb-client-java</artifactId>
    <version>4.0.0</version>
</dependency>
<dependency>
    <groupId>org.influxdb</groupId>
    <artifactId>influxdb-java</artifactId>
    <version>2.20</version>
</dependency>
2、yml組態檔

influx:
  influxUrl: 'http://XXX.XX.XXX.XX:8086'
  bucket: 'tom'
  org: 'my_influxdb'
  token: 'Rt23UemGI_cfS-lFDrurtjh46P1enfhrji-KrZYR04wUR1Yxw_oBCZPL6GmFYSDn20Q9gM_P9DIBhHc2RJjNkA=='
3、配置類

@Setter
@Getter
public class InfluxBean{
    /**
     * 資料庫url地址
     */
    private String influxUrl;
    /**
     * 桶(表)
     */
    private String bucket;
    /**
     * 組織
     */
    private String org;
    /**
     * token
     */
    private String token;
    /**
     * 資料庫連接
     */
    private InfluxDBClient client;
    /**
     * 構造方法
     */
    public InfluxBean(String influxUrl, String bucket, String org, String token) {
        this.influxUrl = influxUrl;
        this.bucket = bucket;
        this.org = org;
        this.token = token;
        this.client = getClient();
    }
    /**
     * 獲取連接
     */
    private InfluxDBClient getClient() {
        if (client == null) {
            client  = InfluxDBClientFactory.create(influxUrl, token.toCharArray());
        }
        return client;
    }
    /**
     * 寫入資料(以秒為時間單位)
     */
    public void write(Object object){
        try (WriteApi writeApi = client.getWriteApi()) {
            writeApi.writeMeasurement(bucket, org, WritePrecision.NS, object);
        }
    }
    /**
     * 讀取資料
     */
    public List<FluxTable> queryTable(String fluxQuery){
        return client.getQueryApi().query(fluxQuery, org);
    }
}
@Data
@Configuration
@ConfigurationProperties(prefix = "influx")
public class InfluxConfig {
    /**
     * url地址
     */
    private String influxUrl;
    /**
     * 桶(表)
     */
    private String bucket;
    /**
     * 組織
     */
    private String org;
    /**
     * token
     */
    private String token;
    /**
     * 初始化bean
     */
    @Bean(name = "influx")
    public InfluxBean InfluxBean() {
        return new InfluxBean(influxUrl, bucket, org, token);
    }
}
4、實作類

@Service
@Slf4j
public class InfluxServiceImpl implements InfluxService {
    @Resource
    private InfluxBean influxBean;
    @Override
    public void insert(InsertParams insertParams) {
        insertParams.setTime(Instant.now());
        influxBean.write(insertParams);
    }
    @Override
    public List<InfluxResult> queue(){
        // 下面兩個 private 方法 賦值給 list 查詢對應的資料
        List<FluxTable> list = queryInfluxAll();
        List<InfluxResult> results = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            for (int j = 0; j < list.get(i).getRecords().size(); j++) {
                InfluxResult influxResult = new InfluxResult();
                influxResult.setCurrent(list.get(i).getRecords().get(j).getValues().get("current").toString());
                influxResult.setEnergyUsed(list.get(i).getRecords().get(j).getValues().get("energyUsed").toString());
                influxResult.setPower(list.get(i).getRecords().get(j).getValues().get("power").toString());
                influxResult.setVoltage(list.get(i).getRecords().get(j).getValues().get("voltage").toString());
                influxResult.setTime(list.get(i).getRecords().get(j).getValues().get("_time").toString());
                System.err.println(list.get(i).getRecords().get(j).getValues().toString());
                results.add(influxResult);
            }
        }
        return results;
    }
    /**
      * description: 查詢一小時內的InsertParams所有資料
      * date: 2022/1/21 13:44
      * author: zhouhong
      * @param  * @param null
      * @return
      */
    private List<FluxTable> queryInfluxAll(){
        String query = " from(bucket: \"tom\")" +
                "  |> range(start: -60m, stop: now())" +
                "  |> filter(fn: (r) => r[\"_measurement\"] == \"influx_test\")" +
                "  |> pivot( rowKey:[\"_time\"], columnKey: [\"_field\"], valueColumn: \"_value\" )";
        return influxBean.queryTable(query);
    }
    /**
      * description: 根據某一個欄位的值過濾(查詢 用電量 energyUsed 為 322 的那條記錄)
      * date: 2022/1/21 12:44
      * author: zhouhong
      * @param  * @param null
      * @return
      */
    public List<FluxTable> queryFilterByEnergyUsed(){
        String query = " from(bucket: \"tom\")" +
                "  |> range(start: -60m, stop: now())" +
                "  |> filter(fn: (r) => r[\"_measurement\"] == \"influx_test\")" +
                "  |> filter(fn: (r) => r[\"energyUsed\"] == \"322\")" +
                "  |> pivot( rowKey:[\"_time\"], columnKey: [\"_field\"], valueColumn: \"_value\" )";
        return influxBean.queryTable(query);
    }
}
C、測驗
1、插入 localhost:9998/inlfuxdb/insert
入參:

{
    "energyUsed":"23.12",
    "power":"321.60",
    "current":"782.72",
    "voltage":"67.43"
}
回傳:
{
    "success": true,
    "code": 200,
    "message": "請求成功",
    "localizedMsg": "請求成功",
    "data": null
}
2、查詢所有
入參:
{}
回傳:

{
    "success": true,
    "code": 200,
    "message": "請求成功",
    "localizedMsg": "請求成功",
    "data": [
        {
            "energyUsed": "23.12",
            "power": "321.60",
            "current": "782.72",
            "voltage": "67.43",
            "time": "2022-01-20T17:51:01.819Z"
        },
        {
            "energyUsed": "243.78",
            "power": "541.50",
            "current": "32.34",
            "voltage": "89.09",
            "time": "2022-01-20T17:33:47.246Z"
        }
    ]
}
D、Flux常見查詢陳述句
1、指定資料源:from(bucket:"tom")
指定時間范圍: 使用管道轉發運算子 ( |>) 將資料從資料源通過管道傳輸到range() 函式,該函式指定查詢的時間范圍,它接受兩個引數:start和stop,范圍可以是使用相對負持續時間 或使用絕對時間

//使用絕對時間
from(bucket:"tom")
  |> range(start: 2022-01-05T23:30:00Z, stop: 2022-01-21T00:00:00Z) 
//過去十五天的資料
from(bucket:"tom")
  |> range(start: -15d)

2、資料過濾
將范圍資料傳遞到filter()函式中,以根據資料屬性或列縮小結果范圍
// 根據 _measurement 和 _field 過濾 
 from(bucket:"tom")
  |> range(start: -15d)
  |> filter(fn: (r) =>
    r._measurement == "influx_test" and
    r._field == "power" and
    r.energyUsed == "23.12"
  )

3、資料轉換
使用函式,將資料聚合為平均值、下采樣資料等
from(bucket:"tom")
  |> range(start: -15d)
  |> filter(fn: (r) =>
    r._measurement == "influx_test"
  )
  |> window(every: 10m)
  
  from(bucket:"tom")
  |> range(start: -15d)
  |> filter(fn: (r) =>
    r._measurement == "influx_test"
  )
  |> window(every: 10m)
  |> mean()
其他查詢函式請查看官網:https://docs.influxdata.com/flux/v0.x/stdlib/universe/

輸了不可怕,大不了從頭再來,我們還年輕---周紅

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/418056.html

標籤:Java

上一篇:面試官太難伺候?一個try-catch問出這么多花樣

下一篇:返回列表

標籤雲
其他(135821) Python(24215) JavaScript(15072) Java(14725) C(11143) 區塊鏈(8215) AI(6884) 基礎類(6313) MySQL(5224) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4203) Linux(4115) PHP(3814) C#(3716) 爪哇(3561) html(3374) C語言(3288) C++語言(3117) sql(3024) R(2776) 熊猫(2774) Java相關(2746) 数组(2739) 疑難問題(2699) 反应(2482) 單片機工控(2479) css(2105) 数据框(1968) Web開發(1951) 节点.js(1938) VBA(1919) 網絡通信(1793) 蟒蛇-3.x(1774) 數據庫相關(1767) VB基礎類(1755) .NETCore(1671) ASP.NET(1650) 開發(1646) 系統維護與使用區(1617) C++(1582) 列表(1581) 基礎和管理(1579) json(1568) JavaEE(1566) 安卓(1523) HtmlCss(1518) 專題技術討論區(1515) Windows客戶端使用(1484) 扑(1469) iOS(1432) 查询(1408) .NET技术(1398) 打字稿(1376) Unity3D(1366) VCL組件開發及應用(1353) sql-server(1287) Qt(1283) 细绳(1226) HTML(CSS)(1220)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Docker安裝InfluxDB1.x和InfluxDB2.x以及與SpringBoot整合

    兩者區別: 1.x 版本使用 influxQL 查詢語言,2.x 和 1.8+(beta) 使用 flux 查詢語法;相比V1 移除了database 和 RP,增加了bucket。 V2具有以下幾個概念: timestamp、field key、field value、field set、tag ......

    uj5u.com 2022-01-22 06:13:01 more
  • 面試官太難伺候?一個try-catch問出這么多花樣

    原創:微信公眾號 【阿Q說代碼】,歡迎分享,轉載請保留出處。 哈嘍大家好,我是阿Q! 剛剛面試回來的B哥又在吐槽了:現在的面試官太難伺候了,放著好好的堆、堆疊、方法區不問,上來就讓我從位元組碼角度給他分析一下try-catch-finally(以下簡稱TCF)的執行效率...... 我覺得應該是面試官在 ......

    uj5u.com 2022-01-22 06:12:35 more
  • java 中定時器

    import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; /** * 說明:java定時器 * 作者:FH Admin * from:fhadmin.cn ......

    uj5u.com 2022-01-22 06:12:25 more
  • Spring Boot 3.0.0 發布第一個里程碑版本M1,你的 Java 升到17 了

    2022年1月20日,Spring官方發布了Spring Boot 3.0.0的第一個里程碑版本M1。 下面一起來來看看Spring Boot 3.0.0 M1版本都有哪些重大變化: Java基線從 Java 8 提升到了 Java 17 這個在最早的Spring Boot 3相關預告中就已經知道了 ......

    uj5u.com 2022-01-22 06:12:20 more
  • 都2022年了,還在爭論編程語言?

    2021年最后一天,我在公眾號發表了文章《Dubbo為什么用Go重寫》,在各個平臺的閱讀量和打開率都挺高,也有各位大佬紛紛轉載,在這里也順便感謝各位大佬。 雖然自己公眾號沒有開通留言,但我也會去看其他平臺或轉載文章的評論。 我發現大家的注意力更多的是在編程語言上,比如下面這些: 看了這些評論想起了一 ......

    uj5u.com 2022-01-22 06:12:10 more
  • 5種高大上的yml檔案讀取方式,你知道嗎?

    只會用@Value和@ConfigurationProperties?那么來看看另外5種方法吧~ ......

    uj5u.com 2022-01-22 06:11:58 more
  • JavaCV的攝像頭實戰之一:基礎

    歡迎訪問我的GitHub 這里分類和匯總了欣宸的全部原創(含配套原始碼):https://github.com/zq2599/blog_demos 關于《JavaCV的攝像頭實戰》系列 《JavaCV的攝像頭實戰》顧名思義,是使用JavaCV框架對攝像頭進行各種處理的實戰集合,這是欣宸作為一名Java ......

    uj5u.com 2022-01-22 06:11:43 more
  • 線上高并發應用重構(寫)填坑經驗分享(二)

    今年在公司重構(寫)了一個老專案,踩了無數的坑。中間好幾次遇到問題,甚至感覺專案可能要失敗了,雖然被坑的不要不要的,但也從中領悟到了不少東西,在這里記錄一下,順便分享給大家樂呵樂呵。 ......

    uj5u.com 2022-01-22 06:11:29 more
  • 史上最全的 Excel 匯入匯出(建議收藏)

    來源:blog.csdn.net/qq_32258777/article/details/89031479 喝水不忘挖井人,感謝阿里巴巴專案組提供了easyexcel工具類,github地址: https://github.com/alibaba/easyexcel 文章目錄 環境搭建 讀取exce ......

    uj5u.com 2022-01-22 06:11:18 more
  • go tool - 快速生成CHANGELOG.md

    前言 在git專案中,通過添加CHANGELOG.md可以展示專案的版本更新記錄,方便用戶查看專案的重大bug修復或不兼容版本資訊。 本文介紹一個 changelog 工具,使用git命令獲取git repository中的所有tags和commits log,生成CHANGELOG.md。 一、使 ......

    uj5u.com 2022-01-22 06:11:03 more