我以前一直在使用这个:
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)
在 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)
参考
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)
归档时间: |
|
查看次数: |
5935 次 |
最近记录: |