aerospike,golang - 获取所有记录的所有bin名称

时间:2017-01-10 11:30:39

标签: go aerospike

只是想检查,是否有办法获取每条记录的所有bin名称?

我知道我们可以使用以下代码获取binmap。但我想读取所有键并创建一个map[string]interface{},然后将该映射转换为字节数组。

这是我获取所有bin的代码,将它们添加到数组中,将数组转换为字节数组:

package main

import (
    "bytes"
    "encoding/gob"
    "fmt"
    as "github.com/aerospike/aerospike-client-go"
    "strconv"
    "time"
)

var client *as.Client


func main() {
    stmt := as.NewStatement("txn", "user")
    stmt.Addfilter(as.NewEqualFilter("p", "param"))
    rs, err := GetAerospikeClient().Query(nil, stmt)
    if err == nil {

        //Conv to byte array
        var ret []interface{}
        for res := range rs.Results() {
            if res.Err != nil {
                // handle error here
                // if you want to exit, cancel the recordset to release the resources
                fmt.Println("Err------", res.Err)

            } else {
                // process record here
                fmt.Printf("Success------%#v\n", res.Record.Bins)
                ret = append(ret, res.Record.Bins)
            }
        }

        b, _ := GetBytes(ret)
        fmt.Println("Len of byte array ", len(b))



    }

}

func GetAerospikeClient() *as.Client {
    var err error
    port, _ := strconv.Atoi("3000")
    maxconn, _ := strconv.Atoi("10")
    host := "172.28.128.3"
    timeout, _ := strconv.Atoi("50")
    idletimeout, _ := strconv.Atoi("3600")
    clientPolicy := as.NewClientPolicy()
    clientPolicy.ConnectionQueueSize = maxconn
    clientPolicy.LimitConnectionsToQueueSize = true
    clientPolicy.Timeout = time.Duration(timeout) * time.Millisecond
    clientPolicy.IdleTimeout = time.Duration(idletimeout) * time.Second
    client, err = as.NewClientWithPolicy(clientPolicy, host, port)
    if err != nil {
        panic(err)
    }
    return client
}   

func GetBytes(key []interface{}) ([]byte, error) {
    var buf bytes.Buffer
    gob.Register(as.BinMap{})
    gob.Register([]interface{}{})
    enc := gob.NewEncoder(&buf)
    err := enc.Encode(key)
    if err != nil {
        panic(err)
        return nil, err
    }
    return buf.Bytes(), nil
}

由于

1 个答案:

答案 0 :(得分:2)

如果您只想要命名空间的bin列表,那么可以采用更便宜的方式。您不需要进行非常昂贵的查询/扫描。一个问题是你无法获得每套。有一个info命令"bins/nsname"(替换" nsname"带有你想要的命名空间名称)来获取该命名空间中的所有bin。

如果您不关心获取binlist的编程方式,可以使用asinfo包提供的aerospike-tools工具来获取该列表。您可以发出以下命令。输出是合理的自我解释。 (替换" 127.0.0.1"使用节点的正确IP地址)

  

asinfo -v" bins / nsname" -h 127.0.0.1

如果您想以编程方式获取列表,可以使用this example中给出的RequestInfo() API并发送上述命令。您应该编写解析器来提取所需的字段。