最近用 redigo 比较多,记录一下 redigo 连接池和实现,并抓个包瞅瞅 redis 交互协议。
个人理解,有误请指出。
package main
import (
"fmt"
"github.com/gomodule/redigo/redis"
)
func main() {
// return conn not conn pool
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("Connect to redis error", err)
return
}
defer conn.Close()
key := "PegasusWang"
conn.Send("INCR", key)
conn.Send("EXPIRE", key, 60)
conn.Flush()
// reply from get
hits, err := redis.Int64(conn.Receive())
fmt.Println(hits, err)
}
/*
RESP(Redis Serialization Protocol): redis序列化协议
resp 把传输的数据结构分成5种最小单元类型,单元结束后统一加上回车换行符 rn
- 单行字符串以+开头
- +hellorn
- 多行字符串以$开头,后缀字符串长度
- $11rnhello worldrn
- 整数值以: 开头,跟上字符串形式
- :1024rn
- 错误消息,以-开头
- WRONGTYPE Operation against a key holding the wrong kind of value
- 数组,以 * 开头,后跟数组的长度
- *3rn:1rn:2rn:3rn
特殊:
- NULL 用多行字符串,长度-1
- $-1rn
- 空串,用多行字符串表示,长度0。注意这里的俩rn 中间隔的是空串
- $0rnrn
### 客户端->服务器
只有一种格式,多行字符串数组
### 服务器->客户端
也是5种基本类型组合
- 单行字符串响应
- 错误响应
- 整数响应
- 多行字符串响应
- 数组响应
- 嵌套
*/