我正在使用“RPUSH”命令将对象的redis基础推送进来。

// 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编码。

现在,我正试图使他们退缩:
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数据。它们以redis的方式推送,因此从gob的角度来看是否可以将其视为 slice ?

我可以遍历其他列表,并一一解码。但是我对效率并不自信。我假设gob想要以其方式编码的 slice 结构。所以我的问题是:为了有效地将我的gob数据 slice 解码为数据结构的集合,是否有技巧?还是应该以其他方式存储数据结构(我假设使用RPUSH存储数据可以防止非原子操作)

最佳答案

LRANGE命令返回一个列表。使用redis.ByteSlices以[] []字节的形式获取该列表。解码列表中的每个料滴:

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会对整个列表进行编码并将其存储为批量字符串:
 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
 }

解码方法如下:
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
}

这是问题所在的这一行代码的补充:
 redis.String(d.Conn.Do("RPUSH", "objects", network.String()))

使用network.Bytes()避免字符串分配。使用redis.Int从RPUSH解码整数返回值。将代码编写为:
 n, err := redis.Int(d.Conn.Do("RPUSH", "objects", network.Bytes()))

或者,如果您不在乎从列表返回的元素数,则将其写为:
 _, err := d.Conn.Do("RPUSH", "objects", network.Bytes())

关于go - Redigo和Gob如何检索Gob数据 slice ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39052200/

10-12 23:52