redis请求协议,支持两种类型:PROTO_REQ_INLINE
(内联型)、PROTO_REQ_MULTIBULK
(协议型)。redis服务器通信中,用的都是协议型请求类型,同时也支持内联型请求类型(没有严格的协议封装,支持简单的请求方式接入)。
1、协议型
请求格式:
*<参数数量> \r\n
$<参数 1 的字节数量> \r\n
<参数 1 的数据> \r\n
...
$<参数 N 的字节数量> \r\n
<参数 N 的数据> \r\n
当使用redis-cli客户端登录时,在终端执行的命令如set test 123
,会根据协议格式转换成如下,并发送给服务器处理:
*3\r\n
$3\r\n
SET\r\n
$4\r\n
test\r\n
$3\r\n
123\r\n
- 当执行
redis-cli -h 127.0.0.1 -p 6379 set test
或echo -en "get testkey\r\nget testkey2\r\n"|redis-cli -h 127.0.0.1 -p 6379
,redis-cli
客户端会自动把消息内容转换成协议格式 - 不通过redis-cli客户端,自行封装redis协议内容,如下(这里有个点,【$】字符前要有【\】,这点个人感觉很奇怪,当内容发送到redis服务器,接受时,【\】就消失了,有点转义的意思??)
get test 命令:echo -en "*2\r\n\$3\r\nget\r\n\$4\r\ntest\r\n"|nc localhost 6379
get test 和 get test2命令:echo -en "*2\r\n\$3\r\nget\r\n\$4\r\ntest\r\n*2\r\n\$3\r\nget\r\n\$5\r\ntest2\r\n"|nc localhost 6379
2、内联型
对于没有redis-cli客户端时,可以方便用内联型命令,内联型命令发送给服务器,即为当前字符串,如下:
get test 命令:echo -en "auth 123\r\nget testkey\r\nget testkey2\r\n"|redis-cli -h 127.0.0.1 -p 6379
(需要密码验证的,需要先执行auth)