RESP (Redis Serialization Protocol)
其实就是 我们把可读性搞的命令通过 resp 转换为 redis server 能够识别的文本, redis server 给我们的响应体也是符合 resp 的.
我们再反序列化成可读的内容
简介
In RESP, the type of some data depends on the first byte:
- For Simple Strings the first byte of the reply is “+”
- For Errors the first byte of the reply is “-“
- For Integers the first byte of the reply is “:”
- For Bulk Strings the first byte of the reply is “\$”
- For Arrays the first byte of the reply is “*“
Additionally RESP is able to represent a Null value using a special variation of Bulk Strings or Array as specified later.
In RESP different parts of the protocol are always terminated with “\r\n” (CRLF).
发送
发送的命令除了根据 resp 转换发送, 还可以通过简化
比如
command = fmt.Sprintf("SET %s %s\r\n", key, strconv.Quote(string(reflect.ValueOf(value).String()))) |
这里其实并没有完全把 set key value 进行 resp 的转换, 只是加了转义避免特殊字符是命令发生错误, 注意结尾需要 \r\n
lock
因为我们需要知道 server 响应体是对应哪一次命令的,所以我们每次执行命令前都需要 lock,
得到本次的响应后才会 unlock
接受
接受的时候就没有简化的方式, 只能老老实实的解析
func integersHandler(c *Client, head string, r *bufio.Reader, locked bool) (string, error) { |
对整数的拂去, 截取 : 后面的为字节数
再去读取相应长度的内容,就是那个数字
解析 slowlog
slowlog 的结构是嵌套的,他的结构比较特殊,所以解析的时候比较”死”
package client |