首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >redigo和gob如何检索gob数据切片

redigo和gob如何检索gob数据切片
EN

Stack Overflow用户
提问于 2016-08-20 16:39:36
回答 1查看 1.6K关注 0票数 1

我使用"RPUSH“命令在我的redis库中添加我的对象。

代码语言:javascript
复制
// object is of type interface

var network bytes.Buffer
gob.NewEncoder(&network)
enc.Encode(object /* interface{} */)

redis.String(d.Conn.Do("RPUSH", "objects", network.String()))

Redigo做了我所期望的,它把所有的数据结构都进行了gob编码。

现在我正试着找回它们:

代码语言:javascript
复制
sall, _ := redis.Strings(d.Conn.Do("LRANGE", "todos", "0", "-1"))
fmt.Printf("%T", sall) // type []string as expected

// At this point, I have no idea if I should store the data in a buffer, or convert it directly as bytes. actually, here I'm lost
var network bytes.Buffer
var object []interface{}


dec := gob.NewDecoder(network)
err := dec.Decode(inout)
fmt.Printf("%v", err) // decode error:EOF

什么是最好的方法来gob-decod他们?我希望将它们作为interface{}的一部分返回。但是即使我的对象被编码为gob数据。它们是以redis的方式推送的,所以从gob的角度来看,它可以被认为是一个切片吗?

我可以迭代其他列表并逐个解码它们。但我对效率不是很有信心。我假设gob想要一个以其方式编码的切片结构。所以我的问题是:有什么技巧可以有效地将我的gob数据片段解码为数据结构的集合吗?或者我应该用另一种方式存储我的数据结构(我假设用RPUSH存储我的数据可以防止非自动操作)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-20 21:21:48

LRANGE命令返回一个列表。使用redis.ByteSlices以字节形式获取该列表。对列表中的每个gob进行解码:

代码语言:javascript
复制
items, err := redis.ByteSlices(d.Conn.Do("LRANGE", "objects", "0", "-1"))
if err != nil {
   // handle error
}
var values []*Object
for _, item := range items {
    var v Object
    if err := gob.NewDecoder(bytes.NewReader(item)).Decode(&v); err != nil {
        // handle error
    }
    values = append(values, &v)
}

这假设为推送到列表中的每个值创建了一个新的gob.Encoder。

如果应用程序不能独立访问Redis中的列表项,则gob对整个列表进行编码,并将其存储为批量字符串:

代码语言:javascript
复制
 var values []*Object
 var buf bytes.Buffer
 if err := gob.NewEncoder(&buf).Encode(values); err != nil {
     // handle error
 }
 if _, err := d.Conn.Do("SET", "objects", buf.Bytes()); err != nil {
     // handler error
 }

下面是如何解码它:

代码语言:javascript
复制
items, err := redis.Bytes(d.Conn.Do("GET", "objects"))
if err != nil {
    // handle error
}
var values []*Objects
if err := gob.NewDecoder(items).Decode(&values); err != nil {
    // handle error
}

下面是问题中这行代码的一个附注:

代码语言:javascript
复制
 redis.String(d.Conn.Do("RPUSH", "objects", network.String()))

使用network.Bytes()来避免字符串分配。使用redis.Int解码RPUSH的整型返回值。将代码编写为:

代码语言:javascript
复制
 n, err := redis.Int(d.Conn.Do("RPUSH", "objects", network.Bytes()))

或者,如果您不关心从列表中返回的元素的数量,可以将其写为:

代码语言:javascript
复制
 _, err := d.Conn.Do("RPUSH", "objects", network.Bytes())
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39052200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档