7.4 通信协议

2016-03-18 22:39:04 3,252 0

Redis通信协议是Redis客户端与Redis之间交流的语言,通信协议规定了命令和返回值的格式。了解Redis通信协议后不仅可以理解AOF文件的格式和主从复制时主数据库向从数据库发送的内容等,还可以开发自己的Redis客户端(不过由于几乎所有常用的语言都有相应的Redis客户端,需要使用通信协议直接和Redis打交道的机会确实不多)。

Redis支持两种通信协议,一种是二进制安全的统一请求协议(unified request protocol),一种是比较直观的便于在telnet程序中输入的简单协议。这两种协议只是命令的格式有区别,命令返回值的格式是一样的。

7.4.1 简单协议

简单协议适合在telnet程序中和Redis通信。简单协议的命令格式就是将命令和各个参数使用空格分隔开,如“EXISTS foo”、“SET foo bar”等。由于Redis解析简单协议时只是简单地以空格分隔参数,所以无法输入二进制字符。我们可以通过telnet程序测试:

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'

提示 Redis 2.4之前的版本对于某些命令可以使用类似简单协议的特殊方式输入二进制安全的参数,例如:

C:SET foo 3
C:bar
S:+OK

其中C:表示客户端发出的内容,S:表示服务端发出的内容。第一行的最后一个参数表示字符串的长度,第二行是字符串的实际内容,因为指定了长度,所以第二行的字符串可以包含二进制字符。但是这个协议已经废弃,被新的统一请求协议取代。“统一”二字指所有的命令使用同样的请求方式而不再为某些命令使用特殊方式,如果需要在参数中包含二进制字符应该使用7.4.2节介绍的统一请求协议。

我们在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

7.4.2 统一请求协议

统一请求协议是从Redis 1.2开始加入的,其命令格式和多行字符串回复的格式很类似,如SET foo bar的统一请求协议写法是“*3\r\n 3\r\nSET\r\n 3\r\nfoo\r\n 3\r\nbar\r\n”。还是使用telnet进行演示:

telnet 127.0.0.1 6379
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
*3
$3
SET
$3
foo
$3
bar
+OK

同样发送命令时指定了后面字符串的长度,所以命令的每个参数都可以包含二进制的字符。统一请求协议的返回值格式和简单协议一样,这里不再赘述。

Redis的AOF文件和主从复制时主数据库向从数据库发送的内容都使用了统一请求协议。如果要开发一个和Redis直接通信的客户端,推荐使用此协议。如果只是想通过telnet向Redis服务器发送命令则使用简单协议就可以了。


上一篇:7.3 安全 下一篇:7.5 管理工具