07-简单协议
9.2.1 简单协议
Redis 2.4 前的版本对于某些命令可以使用类似简单协议的特殊方式输入二进制安全的参数,例如: 其中
C:表示客户端发出的内容,S:表示服务端发出的内容。第一行的最后一个参数表示字符串的长度,第二行是字符串的实际内容,因为指定了长度,所以第二行的字符串可以包含二进制字符。但是这个协议已经废弃,被新的统一请求协议取代。“统一”二字指的所有的命令使用同样的请求方式而不再为某些命令使用特殊方式,如果需要在参数中包含二进制字符应该使用9.2.2节介绍的统一请求协议。
简单协议适合在telnet程序中和Redis通信。简单协议的命令格式就是将命令和各个参数使用空格分隔开,如“ EXISTS foo ”、“ SET foo bar ”等。由于Redis解析简单协议时只是简单地以空格分隔参数,所以无法输入二进制字符。我们可以通过telnet程序测试:
C: SET foo 3
C: bar
S: +OK
$ telnet 127.0.0.1 6379
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
SET foo bar +OK
GET foo $3
bar
LPUSH plist 1 2 3 :3
LRANGE plist 0 -1 *3
$1
3
$1
2
$1
1
ERRORCOMMAND -ERR unknown command 'ERRORCOMMAND'
提示
我们在telnet程序中输入的5条命令恰好展示了Redis的5种返回值类型的格式,2.3.2节介绍了这5种返回值类型在redis-cli中的展现形式,这些展现形式是经过了redis-cli封装的,而上面的内容才是Redis真正返回的格式。下面分别介绍。
1.错误回复
错误回复(error reply)以 - 开头,并在后面跟上错误信息,最后以 \r\n 结尾:
-ERR unknown command 'ERRORCOMMAND'\r\n
2.状态回复
状态回复(status reply)以 + 开头,并在后面跟上状态信息,最后以 \r\n 结尾:
+OK\r\n
3.整数回复
整数回复(integer reply)以 : 开头,并在后面跟上数字,最后以 \r\n 结尾:
:3\r\n
4.字符串回复
字符串回复(bulk reply)以 $ 开头,并在后面跟上字符串的长度,并以 \r\n 分隔,接着是字符串的内容和 \r\n :
$3\r\nbar\r\n
如果返回值是空结果 nil ,则会返回 $-1 以和空字符串相区别。
5.多行字符串回复
多行字符串回复(multi-bulk reply)以 * 开头,并在后面跟上字符串回复的组数,并以 \r\n 分隔。接着后面跟的就是字符串回复的具体内容了:
*3\r\n$1\r\n3\r\n$1\r\n2\r\n$1\r\n1\r\n