1. 程式人生 > 資訊 >Yole 分析師:蘋果的 A14、A15 仿生晶片成為改變遊戲規則的 SoC 解決方案

Yole 分析師:蘋果的 A14、A15 仿生晶片成為改變遊戲規則的 SoC 解決方案

influxDB

本文介紹了influxDB時序資料庫及Go語言操作influxDB

InfluxDB是一個開源分散式時序、事件和指標資料庫。使用Go語言編寫,無需外部依賴。其設計目標是實現分散式和水平伸縮擴充套件。

教程

安裝

下載地址

文件

github

2.2下載

2.2安裝

將上一步的壓縮包,解壓到本地。

啟動

瀏覽器開啟訪問8086埠,建立使用者資訊

1.7 安裝

1.7基本命令官方文件

1.17下載

解壓檔案

修改配置檔案

[meta]
  # Where the metadata/raft database is stored
  # dir = "/var/lib/influxdb/meta"
  dir = "D:/software/influxdb-1.7.7-1/meta"
  
 
[data]
  # The directory where the TSM storage engine stores TSM files.
  dir = "D:/software/influxdb-1.7.7-1/data"

  # The directory where the TSM storage engine stores WAL files.
  wal-dir = "D:/software/influxdb-1.7.7-1/wal

啟動

influxDB介紹

名詞介紹

influxDB名詞 傳統資料庫概念
database 資料庫
measurement 資料表
point 資料行

point

influxDB中的point相當於傳統資料庫裡的一行資料,由時間戳(time)、資料(field)、標籤(tag)組成。

Point屬性 傳統資料庫概念
time 每個資料記錄時間,是資料庫中的主索引
field 各種記錄值(沒有索引的屬性),例如溫度、溼度
tags 各種有索引的屬性,例如地區、海拔

Series

Series相當於是 InfluxDB 中一些資料的集合,在同一個 database 中,retention policy、measurement、tag sets 完全相同的資料同屬於一個 series,同一個 series 的資料在物理上會按照時間順序排列儲存在一起。

想要了解更多

Go操作influxDB

安裝

influxDB 1.x版本

github

go get github.com/influxdata/influxdb1-client/v2
package main

import (
	"fmt"
	"log"
	"time"

	client "github.com/influxdata/influxdb1-client/v2"
)

// influxdb demo

func connInflux1() client.Client {
	cli, err := client.NewHTTPClient(client.HTTPConfig{
		Addr:     "http://127.0.0.1:8086",
		Username: "admin",
		Password: "",
	})
	if err != nil {
		log.Fatal(err)
	}
	return cli
}

// query
func queryDB1(cli client.Client, cmd string) (res []client.Result, err error) {
	q := client.Query{
		Command:  cmd,
		Database: "randy",
	}
	if response, err := cli.Query(q); err == nil {
		if response.Error() != nil {
			return res, response.Error()
		}
		res = response.Results
	} else {
		return res, err
	}
	return res, nil
}

// insert
func writesPoints1(cli client.Client) {
	bp, err := client.NewBatchPoints(client.BatchPointsConfig{
		Database:  "randy",
		Precision: "s", //精度,預設ns
	})
	if err != nil {
		log.Fatal(err)
	}
	// 新增多條資料
	tags := map[string]string{"cpu": "ih-cpu"}
	fields := map[string]interface{}{
		"idle":   201.1,
		"system": 43.3,
		"user":   86.6,
	}
	// 新增資料
	pt, err := client.NewPoint("cpu_usage", tags, fields, time.Now())
	if err != nil {
		log.Fatal(err)
	}
	bp.AddPoint(pt)

	// 寫入資料
	err = cli.Write(bp)
	if err != nil {
		log.Fatal(err)
	}
	log.Println("insert success")
}

func main() {
	conn := connInflux1()
	fmt.Println(conn)

	// insert
	writesPoints1(conn)

	// 獲取10條資料並展示
	qs := fmt.Sprintf("SELECT * FROM %s LIMIT %d", "cpu_usage", 10)
	res, err := queryDB1(conn, qs)
	if err != nil {
		log.Fatal(err)
	}

	for _, row := range res[0].Series[0].Values {
		for j, value := range row {
			log.Printf("j:%d value:%v\n", j, value)
		}
	}
}

influxDB 2.x版本

go get github.com/influxdata/influxdb-client-go

基本使用-influxDB 2.x版本

package main

import (
	"context"
	"fmt"
	"github.com/influxdata/influxdb-client-go/v2"
	"log"
	"time"
)

/*
@author RandySun
@create 2021-09-17-8:58
*/

var bucket = "RandySun"
var org = "RandySun"

func connInflux() influxdb2.Client {
	// 連線資料庫客戶端
	token := "iLgyKP7N4-oTGKSj-vGVD8w9p-tHJQ-24BNouCfb4HEtHlSU-GeOCZ0cCWE3RauoSZDmVHJuB7Rg71Xd2b22sQ=="
	url := "http://127.0.0.1:8086"
	client := influxdb2.NewClient(url, token)
	return client
}

// insert
func writesPoints(client influxdb2.Client, org, bucket string) {

	tags := map[string]string{"cpu": "ih-cpu"}
	fields := map[string]interface{}{
		"idle":   201.1,
		"system": 43.3,
		"user":   86.6,
	}
	// 建立資料點
	pt := influxdb2.NewPoint("cpu_usage", tags, fields, time.Now())
	// 獲取寫入資料客戶端
	writeAPI := client.WriteAPIBlocking(org, bucket)

	// 寫入資料
	writeAPI.WritePoint(context.Background(), pt)
	log.Println("insert success")
}

//// query
func queryDB(client influxdb2.Client, org string) (err error) {

	queryAPI := client.QueryAPI(org)

	result, err := queryAPI.Query(context.Background(), `from(bucket:"RandySun")
    |> range(start: -1h) 
    |> filter(fn: (r) => r._measurement == "cpu_usage")`)
	if err == nil {
		for result.Next() {
			if result.TableChanged() {
				fmt.Printf("table: %s\n", result.TableMetadata().String())
			}
			fmt.Printf("value: %v\n", result.Record().Value())
		}
		if result.Err() != nil {
			fmt.Printf("query parsing error: %s\n", result.Err().Error())
		}
	} else {
		panic(err)
	}
	return nil
}

func main() {
	client := connInflux()
	fmt.Println(client)
	writesPoints(client, org, bucket)
	queryDB(client, "RandySun")
}

在當下的階段,必將由程式設計師來主導,甚至比以往更甚。