6

我以前一直在使用这个:

data, err := redis.Bytes(c.Do("GET", key))

确保返回的数据是字节切片。

但是,我现在需要向 Redis 请求添加一个额外的命令,所以我有这样的东西:

c.Send("MULTI")
c.Send("GET", key)
c.Send("EXPIRE", key)
r, err := c.Do("EXEC")

但现在我似乎无法让GET命令返回一段字节。我试过redis.Bytes像下面这样添加,但没有运气。

c.Send("MULTI")
redis.Bytes(c.Send("GET", key))
c.Send("EXPIRE", key)
r, err := c.Do("EXEC")
4

2 回答 2

6

在 redis 中,EXEC命令返回一个数组,其中包含事务中所有命令的结果。

redigo 提供了一个Values函数,它将数组命令回复转换为[]interface{}.

c.Send("MULTI")
c.Send("GET", key)
c.Send("EXPIRE", key)
r, err := redis.Values(c.Do("EXEC"))

r[0]现在你的GET命令的回复是 a interface{},所以你需要做一个类型断言来获得你期望的字节片:

data := r[0].([]byte)

参考

于 2015-12-02T03:04:09.813 回答
4

MULTI用于通过创建事务以原子方式向 Redis 发送多个命令。这根本不是管道。

在调用之前实际上不会执行任何命令,因此从事务中EXEC调用时无法获取值。GET

从文档:

当 Redis 连接在 MULTI 请求的上下文中时,所有命令都将使用字符串 QUEUED 进行回复(从 Redis 协议的角度来看,作为状态回复发送)。当调用 EXEC 时,队列中的命令只是安排执行。

在 redigo 中,流水线以不同的方式完成:

http://godoc.org/github.com/garyburd/redigo/redis#hdr-Pipelining

你想要做的是这样的(未经测试):

c.Send("GET", key)
c.Send("EXPIRE", key)
c.Flush()
v := redis.Bytes(c.Receive()) // reply from GET
_, err = c.Receive() // reply from EXPIRE
于 2015-05-29T08:56:41.920 回答