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. 性能优化技巧
- 批量写入:使用事务批量写入数据
- 异步操作:对于不需要即时验证的写入,使用异步API
- 连接池:复用客户端连接
- 索引设计:合理设计SQL表的索引
6. 实际应用场景
- 审计日志系统
- 金融交易记录
- 医疗数据存储
- 供应链溯源
- 区块链相关应用
Immudb的不可变特性使其成为需要数据完整性保证场景的理想选择。通过Golang客户端,可以方便地将其集成到现有应用中。