###简介
redis的通信协议是Redis Serialization Protocol,简称RESP,有如下特性:
是二进制安全的
使用TCP
基于请求-响应的模式
需注意的是:RESP是redis客户端和服务端通信的协议,节点交互不使用这个协议。
###RESP描述
RESP有五种最小的单元类型,单元结束时统一加上回车换行符号\r\n。
单行字符串 以 + 符号开头。
多行字符串 以 $ 符号开头,后跟字符串长度。
整数值 以 : 符号开头,后跟整数的字符串形式。
错误消息 以 - 符号开头。
数组 以 * 号开头,后跟数组的长度。
如:
单行字符串
+hello world\r\n
错误消息
-WRONGTYPE Operation against a key holding the wrong kind of value\r\n
整数值
:1024\r\n
多行字符串
$11\r\nhello world\r\n
数组[1,2,3]
*3\r\n:1\r\n:2\r\n:3\r\n
###客户端->服务端
客户端向服务器发送的指令只有一种格式,多行字符串数组。
比如一个简单的 set 指令set author codehole会被序列化成下面的字符串。
*3\r\n$3\r\nset\r\n$6\r\nauthor\r\n$8\r\ncodehole\r\n
###服务器 -> 客户端
服务器向客户端回复的响应支持多种数据结构,即以上 5 中基本类型的组合。
###抓包看看
我们用wireshark来抓下包,看看实际的RESP。
在redis上增加个key
127.0.0.1:6379> set hi 'hello world'
OK
1. 客户端发送给服务端
看data段的数据,整个数据结构是RESP的多行字符串结构,以*3开头,后面两个字节是0d,0a,对应ASCII是回车键和换行键,即\r和\n,后面的结构都符合多行字符串结构。
2. 服务端发送给客户端
服务端返回的是ok,结构是单行字符串的,即
+ok\r\n
感兴趣的话,可以再抓抓其他的数据结构。