golang Aerospike 数据库连接插件库asc的使用
Golang Aerospike 数据库连接插件库asc的使用
简介
asc 是一个用于连接 Aerospike 数据库的 Go 语言库,兼容 Go 1.11+ 版本。
配置参数
Aerospike 客户端/策略配置参数
- timeoutMs
- connectionTimeout
- serverSocketTimeout
- scanPct
- host
- port
- namespace
- sleepBetweenRetries
- batchSize
keyColumn, keyColumnName
定义用作记录键的列名(默认为’id’),可以按表指定,例如:
events.keyColumn = code
excludedColumns
要从记录中排除的列列表(例如:id - 如果我们只需要它作为记录键)
dateFormat
用于 time.Time 转换的 ISO 日期格式
optimizeLargeScan
实验性功能,首先扫描所有键并将其写入磁盘,然后使用单独的 go 例程使用转储的键扫描数据。您只能指定 scanBaseDirectory
使用示例
以下是一个简单的 CRUD 操作示例:
config.yaml 配置文件
driverName: aerospike
parameters:
namespace: test
host: 127.0.0.1
dateFormat: yyyy-MM-dd hh:mm:ss
Go 代码示例
package main
import (
_ "github.com/aerospike/aerospike-client-go"
_ "github.com/viant/asc"
"github.com/viant/dsc"
"log"
)
type Interest struct {
Id int `autoincrement:"true"`
Name string
ExpiryTimeInSecond int `column:"expiry"`
Category string
}
func main() {
config, err := dsc.NewConfigFromURL("config.yaml")
if err != nil {
log.Fatal(err)
}
factory := dsc.NewManagerFactory()
manager, err := factory.Create(config)
if err != nil {
log.Fatal(err)
}
interest := &Interest{}
success, err:= manager.ReadSingle(interest, "SELECT id, name, expiry, category FROM interests WHERE id = ?", []interface{}{id},nil)
if err != nil {
panic(err.Error())
}
var intersts = make([]*Interest, 0)
err = manager.ReadAll(&intersts, "SELECT id, name, expiry, category FROM interests", nil ,nil)
if err != nil {
panic(err.Error())
}
intersts = []*Interest {
Interest{Name:"Abc", ExpiryTimeInSecond:3600, Category:"xyz"},
Interest{Name:"Def", ExpiryTimeInSecond:3600, Category:"xyz"},
Interest{Id:"20, Name:"Ghi", ExpiryTimeInSecond:3600, Category:"xyz"},
}
_, _, err = manager.PersistAll(&intersts, "intersts", nil)
if err != nil {
panic(err.Error())
}
fmt.Printf("Inserted %v, updated: %v\n", inserted, updated)
deleted, err := manager.DeleteAll(&intersts, "intersts", nil)
if err != nil {
panic(err.Error())
}
fmt.Printf("Inserted %v, updated: %v\n", deleted)
var records = []map[string]interface{}{}
err = manager.ReadAll(&records, "SELECT id, name, expiry, category FROM interests", nil ,nil)
if err != nil {
panic(err.Error())
}
}
查询级别 UDF 支持
ARRAY
将提供的源列转换为定义为 (key, value) 的映射条目集合
SELECT
id,
username,
ARRAY(city_visited) AS visited
FROM users
JSON
将提供的源列转换为 JSON
SELECT
id,
username,
JSON(city_visited) AS visited
FROM users
许可证
源代码根据 Apache License, Version 2 的条款提供,如 LICENSE 文件中所述。
个别文件可能根据其特定的许可证提供,所有许可证都与 Apache License, Version 2 兼容。请参阅各个文件以获取详细信息。
作者和贡献者
库作者: Adrian Witas
贡献者:
更多关于golang Aerospike 数据库连接插件库asc的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang Aerospike 数据库连接插件库asc的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang Aerospike 数据库连接插件库 asc 使用指南
Aerospike 是一个高性能的分布式 NoSQL 数据库,而 asc
是 Go 语言中用于连接 Aerospike 的客户端库。下面我将详细介绍如何使用 asc
库连接和操作 Aerospike 数据库。
安装 asc 库
首先需要安装 asc 客户端库:
go get github.com/aerospike/aerospike-client-go
基本连接示例
package main
import (
"fmt"
"log"
aerospike "github.com/aerospike/aerospike-client-go"
)
func main() {
// 定义连接参数
host := "localhost"
port := 3000
namespace := "test"
setName := "users"
// 创建客户端连接
client, err := aerospike.NewClient(host, port)
if err != nil {
log.Fatalf("连接Aerospike失败: %v", err)
}
defer client.Close()
fmt.Println("成功连接到Aerospike服务器")
// 检查集群是否可用
if !client.IsConnected() {
log.Fatal("客户端未连接到任何节点")
}
// 基本操作示例
key, err := aerospike.NewKey(namespace, setName, "user1")
if err != nil {
log.Fatal(err)
}
// 写入数据
bin1 := aerospike.NewBin("username", "john_doe")
bin2 := aerospike.NewBin("email", "john@example.com")
bin3 := aerospike.NewBin("age", 30)
err = client.Put(nil, key, bin1, bin2, bin3)
if err != nil {
log.Fatalf("写入数据失败: %v", err)
}
// 读取数据
record, err := client.Get(nil, key)
if err != nil {
log.Fatalf("读取数据失败: %v", err)
}
fmt.Printf("读取到的数据: %+v\n", record.Bins)
// 删除数据
existed, err := client.Delete(nil, key)
if err != nil {
log.Fatalf("删除数据失败: %v", err)
}
fmt.Printf("数据是否被删除: %v\n", existed)
}
高级功能示例
1. 批量操作
// 批量写入
keys := []*aerospike.Key{}
for i := 1; i <= 5; i++ {
key, _ := aerospike.NewKey(namespace, setName, fmt.Sprintf("user%d", i))
keys = append(keys, key)
bin1 := aerospike.NewBin("username", fmt.Sprintf("user%d", i))
bin2 := aerospike.NewBin("value", i*10)
client.Put(nil, key, bin1, bin2)
}
// 批量读取
records, err := client.BatchGet(nil, keys)
if err != nil {
log.Fatal(err)
}
for _, rec := range records {
if rec != nil {
fmt.Printf("Key: %s, Value: %v\n", rec.Key.Value(), rec.Bins)
}
}
2. 查询操作
// 创建二级索引
indexTask, err := client.CreateIndex(
nil,
namespace,
setName,
"age_index",
"age",
aerospike.NUMERIC,
)
if err != nil {
log.Fatal(err)
}
// 等待索引创建完成
<-indexTask.OnComplete()
// 执行查询
stmt := aerospike.NewStatement(namespace, setName)
stmt.SetFilter(aerospike.NewRangeFilter("age", 25, 35))
recordSet, err := client.Query(nil, stmt)
if err != nil {
log.Fatal(err)
}
for res := range recordSet.Results() {
if res.Err != nil {
log.Printf("查询错误: %v", res.Err)
continue
}
fmt.Printf("查询结果: %+v\n", res.Record.Bins)
}
3. 连接池配置
// 自定义客户端策略
clientPolicy := aerospike.NewClientPolicy()
clientPolicy.ConnectionQueueSize = 100 // 连接池大小
clientPolicy.LimitConnectionsToQueueSize = true
clientPolicy.Timeout = 10 * time.Second // 超时时间
// 使用自定义策略创建客户端
client, err := aerospike.NewClientWithPolicy(clientPolicy, host, port)
if err != nil {
log.Fatal(err)
}
defer client.Close()
最佳实践
-
重用客户端:Aerospike 客户端是线程安全的,应该在整个应用程序中重用,而不是为每个请求创建新客户端。
-
错误处理:Aerospike 可能返回不同类型的错误,如网络错误、超时错误等,应该适当处理。
-
连接池:根据应用负载调整连接池大小,避免连接不足或过多。
-
二级索引:对于频繁查询的字段创建二级索引以提高查询性能。
-
批处理:对于批量操作使用批处理方法,减少网络往返。
-
监控:定期检查客户端和集群状态,确保连接健康。
总结
asc 库提供了丰富的功能来操作 Aerospike 数据库,从基本的 CRUD 操作到高级查询和批量处理。通过合理配置客户端参数和遵循最佳实践,可以构建高性能的 Aerospike 应用程序。