golang轻量级高性能不可变数据库插件库immudb的使用

Golang轻量级高性能不可变数据库插件库immudb的使用

immudb是一个内置加密证明和验证的数据库,它跟踪敏感数据的变化,并通过客户端保护历史完整性,无需信任数据库本身。它可以作为键值存储、文档模型数据库和/或关系数据库(SQL)运行。

快速开始

运行immudb可执行文件

你可以从GitHub最新发布下载immudb二进制文件。下载后重命名为immudb并赋予可执行权限:

wget https://github.com/codenotary/immudb/releases/download/v1.9.5/immudb-v1.9.5-linux-amd64
mv immudb-v1.9.5-linux-amd64 immudb
chmod +x immudb

# 前台运行查看所有输出
./immudb

# 或后台运行
./immudb -d

使用Docker运行

docker run -d --net host -it --rm --name immudb codenotary/immudb:latest

使用Kubernetes运行

helm repo add immudb https://packages.codenotary.org/helm
helm repo update
helm install immudb/immudb --generate-name

Golang集成示例

以下是使用Golang SDK连接和操作immudb的完整示例:

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/codenotary/immudb/pkg/api/schema"
	"github.com/codenotary/immudb/pkg/client"
)

func main() {
	// 创建immudb客户端
	opts := client.DefaultOptions()
	opts.Address = "localhost" // immudb服务器地址
	opts.Port = 3322          // immudb服务器端口

	// 连接immudb
	client, err := client.NewImmuClient(opts)
	if err != nil {
		log.Fatal(err)
	}
	defer client.Disconnect()

	// 登录(默认用户名密码为immudb/immudb)
	loginResp, err := client.Login(context.Background(), []byte("immudb"), []byte("immudb"))
	if err != nil {
		log.Fatal(err)
	}
	defer client.Logout(context.Background())

	// 设置上下文包含认证token
	ctx := context.Background()
	ctx = context.WithValue(ctx, "token", loginResp.Token)

	// 创建或使用已有数据库
	dbName := "defaultdb"
	_, err = client.UseDatabase(ctx, &schema.Database{DatabaseName: dbName})
	if err != nil {
		log.Fatal(err)
	}

	// 写入键值对
	key := []byte("myKey")
	value := []byte("myValue")
	
	// 设置值并获取验证信息
	tx, err := client.Set(ctx, key, value)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Successfully set key '%s' at transaction %d\n", key, tx.Id)

	// 读取键值对并验证
	entry, err := client.Get(ctx, key)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Retrieved value: %s\n", entry.Value)

	// 使用SQL功能
	// 创建表
	_, err = client.SQLExec(ctx, `
		CREATE TABLE IF NOT EXISTS users (
			id INTEGER AUTO_INCREMENT,
			name VARCHAR,
			age INTEGER,
			PRIMARY KEY (id)
		)`, nil)
	if err != nil {
		log.Fatal(err)
	}

	// 插入数据
	params := make(map[string]interface{})
	params["name"] = "John Doe"
	params["age"] = 30
	
	_, err = client.SQLExec(ctx, "INSERT INTO users(name, age) VALUES (@name, @age)", params)
	if err != nil {
		log.Fatal(err)
	}

	// 查询数据
	result, err := client.SQLQuery(ctx, "SELECT * FROM users", nil, true)
	if err != nil {
		log.Fatal(err)
	}
	
	for _, row := range result.Rows {
		fmt.Printf("User: ID=%d, Name=%s, Age=%d\n", 
			row.Values[0].GetN(), 
			row.Values[1].GetS(), 
			row.Values[2].GetN())
	}
}

技术规格

主题 描述
数据库模型 具有3D访问的键值存储、文档模型、SQL
数据方案 无模式
实现语言 Go
服务器API gRPC
分区方法 分片
一致性概念 立即一致性
事务概念 具有快照隔离(SSI)的ACID
持久性
快照
高读取吞吐量
高写入吞吐量
针对SSD优化

性能数据

immudb可以处理每秒数百万次写入。以下表格显示了在4核E3-1275v6 CPU和SSD磁盘的机器上插入100万条记录的性能:

条目 工作线程 批次 批次数 时间(s) 条目/秒
1M 20 1000 50 1.061 1.2M /s
1M 50 1000 20 0.543 1.8M /s
1M 100 1000 10 0.615 1.6M /s

immudb是一个强大的不可变数据库解决方案,适用于需要数据完整性和审计能力的各种应用场景。


更多关于golang轻量级高性能不可变数据库插件库immudb的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang轻量级高性能不可变数据库插件库immudb的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Immudb: Golang轻量级高性能不可变数据库插件库使用指南

Immudb是一个轻量级、高性能的不可变数据库,专为需要数据完整性保证的应用场景设计。它提供了不可篡改的数据存储能力,同时保持了高性能特性。下面我将详细介绍如何在Golang中使用immudb。

1. Immudb核心特性

  • 不可变性:一旦写入数据就无法修改或删除
  • 密码学验证:所有操作都有密码学证明
  • 高性能:支持每秒数千次写入操作
  • 轻量级:可作为嵌入式数据库或独立服务
  • SQL支持:提供类似SQL的查询接口

2. 安装Immudb

首先安装immudb服务端和Golang客户端库:

# 安装immudb服务端 (Linux/macOS)
curl -s https://packages.immudb.io/install.sh | bash

# 启动immudb服务
immudb

# 安装Golang客户端
go get github.com/codenotary/immudb/pkg/client

3. 基本使用示例

3.1 连接Immudb

package main

import (
	"context"
	"log"

	"github.com/codenotary/immudb/pkg/client"
)

func main() {
	// 创建客户端
	opts := client.DefaultOptions()
	opts.Username = "immudb"
	opts.Password = "immudb"
	
	client, err := client.NewImmuClient(opts)
	if err != nil {
		log.Fatal(err)
	}
	defer client.Disconnect()
	
	// 登录
	ctx := context.Background()
	_, err = client.Login(ctx, []byte(opts.Username), []byte(opts.Password))
	if err != nil {
		log.Fatal(err)
	}
	
	log.Println("成功连接到immudb")
}

3.2 写入和读取数据

func writeAndReadExample(client client.ImmuClient, ctx context.Context) {
	// 写入数据
	key := []byte("myKey")
	value := []byte("myValue")
	
	_, err := client.Set(ctx, key, value)
	if err != nil {
		log.Fatal(err)
	}
	
	// 读取数据
	entry, err := client.Get(ctx, key)
	if err != nil {
		log.Fatal(err)
	}
	
	log.Printf("读取数据 - Key: %s, Value: %s\n", key, entry.Value)
	
	// 验证数据完整性
	verifiedEntry, err := client.VerifiedGet(ctx, key)
	if err != nil {
		log.Fatal(err)
	}
	log.Println("数据完整性验证通过")
}

3.3 使用事务

func transactionExample(client client.ImmuClient, ctx context.Context) {
	// 开始事务
	tx, err := client.NewTx(ctx)
	if err != nil {
		log.Fatal(err)
	}
	
	// 在事务中写入多个键值对
	err = tx.Set(ctx, []byte("txKey1"), []byte("txValue1"))
	if err != nil {
		log.Fatal(err)
	}
	
	err = tx.Set(ctx, []byte("txKey2"), []byte("txValue2"))
	if err != nil {
		log.Fatal(err)
	}
	
	// 提交事务
	_, err = tx.Commit(ctx)
	if err != nil {
		log.Fatal(err)
	}
	
	log.Println("事务提交成功")
}

4. 高级功能

4.1 使用SQL接口

func sqlExample(client client.ImmuClient, ctx context.Context) {
	// 创建表
	_, err := client.SQLExec(ctx, `
		CREATE TABLE IF NOT EXISTS users (
			id INTEGER AUTO_INCREMENT,
			username VARCHAR[50],
			age INTEGER,
			active BOOLEAN,
			PRIMARY KEY id
		)`, nil)
	if err != nil {
		log.Fatal(err)
	}
	
	// 插入数据
	_, err = client.SQLExec(ctx, `
		INSERT INTO users(username, age, active)
		VALUES (?, ?, ?)`, map[string]interface{}{
		"param1": "user1",
		"param2": 30,
		"param3": true,
	})
	if err != nil {
		log.Fatal(err)
	}
	
	// 查询数据
	res, err := client.SQLQuery(ctx, "SELECT * FROM users WHERE age > ?", map[string]interface{}{
		"param1": 20,
	}, true)
	if err != nil {
		log.Fatal(err)
	}
	
	for _, row := range res.Rows {
		log.Printf("User: %v, Age: %v, Active: %v\n", 
			row.Values[1].GetS(), 
			row.Values[2].GetN(),
			row.Values[3].GetB())
	}
}

4.2 历史记录查询

func historyExample(client client.ImmuClient, ctx context.Context) {
	key := []byte("versionedKey")
	
	// 写入多个版本
	client.Set(ctx, key, []byte("v1"))
	client.Set(ctx, key, []byte("v2"))
	client.Set(ctx, key, []byte("v3"))
	
	// 获取历史记录
	history, err := client.History(ctx, key, 0, 0, true)
	if err != nil {
		log.Fatal(err)
	}
	
	for _, item := range history.Entries {
		log.Printf("TxID: %d, Value: %s\n", item.Tx, item.Value)
	}
}

5. 性能优化技巧

  1. 批量写入:使用事务批量写入数据
  2. 异步操作:对于不需要即时验证的写入,使用异步API
  3. 连接池:复用客户端连接
  4. 索引设计:合理设计SQL表的索引

6. 实际应用场景

  • 审计日志系统
  • 金融交易记录
  • 医疗数据存储
  • 供应链溯源
  • 区块链相关应用

Immudb的不可变特性使其成为需要数据完整性保证场景的理想选择。通过Golang客户端,可以方便地将其集成到现有应用中。

回到顶部