conn.go
func (c *conn) do(cmd string, args ...interface{}) (interface{}, error){
if cmd != { if err := c.writecommand(cmd, args); err != nil { return nil, c.fatal(err) } } if err := c.bw.flush(); err != nil { return nil, c.fatal(err) } for i := 0; i <= pending; i++ { var e error if reply, e = c.readreply(); e != nil { return nil, c.fatal(e) } if e, ok := reply.(error); ok && err == nil { err = e } }
}
方法封装了一个请求的3个过程 send, flush and receive
1,send 将请求写到输出缓冲
2, flush将缓冲区的命令发送到服务端
3,receive 接收服务端的响应
https://godoc.org/github.com/gomodule/redigo/redis#hdr-pipelining
// conn is the low-level implementation of conn
因为redis是文本协议,因此发送时需要按照redis协议序列化,接收的时候按照redis协议反序列化。
客户端发送命令的格式(类型):5种类型 间隔符号,在linux下是\r\n,在windows下是\n
1. 简单字符串 simple strings, 以 +加号 开头 格式:+ 字符串 \r\n
字符串不能包含 cr或者 lf(不允许换行)
eg: +ok\r\n
注意:为了发送二进制安全的字符串,一般推荐使用后面的 bulk strings类型
2. 错误 errors, 以-减号 开头格式:- 错误前缀 错误信息 \r\n
错误信息不能包含 cr或者 lf(不允许换行),errors与simple strings很相似,不同的是erros会被当作异常来看待
eg: -error unknow command 'foobar'\r\n
3. 整数型 integer, 以 : 冒号开头格式:: 数字 \r\n
eg: :1000\r\n
4. 大字符串类型 bulk strings, 以 $美元符号开头,长度限制512m格式:$ 字符串的长度 \r\n 字符串 \r\n
字符串不能包含 cr或者 lf(不允许换行);
eg: $6\r\nfoobar\r\n 其中字符串为 foobar,而6就是foobar的字符长度
$0\r\n\r\n 空字符串
$-1\r\n null
5. 数组类型 arrays,以 *星号开头格式:* 数组元素个数 \r\n 其他所有类型 (结尾不需要\r\n)
注意:只有元素个数后面的\r\n是属于该数组的,结尾的\r\n一般是元素的
eg: *0\r\n 空数组
*2\r\n$2\r\nfoo\r\n$3\r\nbar\r\n 数组包含2个元素,分别是字符串foo和bar
*3\r\n:1\r\n:2\r\n:3\r\n 数组包含3个整数:1、2、3
*5\r\n:1\r\n:2\r\n:3\r\n:4\r\n$6\r\nfoobar\r\n 包含混合类型的数组
*-1\r\n null数组
*2\r\n*3\r\n:1\r\n:2\r\n:3\r\n*2\r\n+foo\r\n-bar\r\n 数组嵌套,外层数组包含2个数组,整理后如下:
*2\r\n
*3\r\n:1\r\n:2\r\n:3\r\n
*2\r\n+foo\r\n-bar\r\n
以上就是golang redis客户端怎么连接的详细内容。
