我以前一直在用这个:
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")
答案 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)
<强>参考强>