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

1 回复

更多关于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()

最佳实践

  1. 重用客户端:Aerospike 客户端是线程安全的,应该在整个应用程序中重用,而不是为每个请求创建新客户端。

  2. 错误处理:Aerospike 可能返回不同类型的错误,如网络错误、超时错误等,应该适当处理。

  3. 连接池:根据应用负载调整连接池大小,避免连接不足或过多。

  4. 二级索引:对于频繁查询的字段创建二级索引以提高查询性能。

  5. 批处理:对于批量操作使用批处理方法,减少网络往返。

  6. 监控:定期检查客户端和集群状态,确保连接健康。

总结

asc 库提供了丰富的功能来操作 Aerospike 数据库,从基本的 CRUD 操作到高级查询和批量处理。通过合理配置客户端参数和遵循最佳实践,可以构建高性能的 Aerospike 应用程序。

回到顶部