Redigo 多请求

tom*_*456 6 go redis redigo

我以前一直在使用这个:

data, err := redis.Bytes(c.Do("GET", key))
Run Code Online (Sandbox Code Playgroud)

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

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

c.Send("MULTI")
c.Send("GET", key)
c.Send("EXPIRE", key)
r, err := c.Do("EXEC")
Run Code Online (Sandbox Code Playgroud)

但现在我似乎无法让GET命令返回一个字节片。我试过添加redis.Bytes如下,但没有运气。

c.Send("MULTI")
redis.Bytes(c.Send("GET", key))
c.Send("EXPIRE", key)
r, err := c.Do("EXEC")
Run Code Online (Sandbox Code Playgroud)

wya*_*imo 6

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

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

c.Send("MULTI")
c.Send("GET", key)
c.Send("EXPIRE", key)
r, err := redis.Values(c.Do("EXEC"))
Run Code Online (Sandbox Code Playgroud)

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

data := r[0].([]byte)
Run Code Online (Sandbox Code Playgroud)

参考


Sir*_*ius 4

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

调用之前不会真正执行任何命令EXEC,因此调用时无法获取值GET,因此当您从事务中

来自文档:

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

在 redigo 中,管道是通过不同的方式完成的:

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

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

c.Send("GET", key)
c.Send("EXPIRE", key)
c.Flush()
v := redis.Bytes(c.Receive()) // reply from GET
_, err = c.Receive() // reply from EXPIRE
Run Code Online (Sandbox Code Playgroud)