Redigo多请求

时间:2015-05-29 08:39:21

标签: go redis redigo

我以前一直在用这个:

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")

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

在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命令的回复作为interface{},因此您需要执行类型断言以获取您期望的字节切片:< / p>

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

<强>参考