前言

简单介绍一下客户端的通信协议。

正文

第 一,客户端与服务端之间的通信协议是在TCP协议之上构建的。

第二, Redis制定了RESP(REdis Serialization Protocol,Redis序列化协议)实现客户端与服务端的正常交互,这种协议简单高效,既能够被机器解析,又容易 被人类识别。

例如客户端发送一条set hello world命令给服务端,按照RESP 的标准,客户端需要将其封装为如下格式(每行用\r\n分隔):

redis 简单整理——客户端通信协议[十五]_客户端

这样Redis服务端能够按照RESP将其解析为set hello world命令,执行后 回复的格式如下:

redis 简单整理——客户端通信协议[十五]_客户端_02

可以看到除了命令(set hello world)和返回结果(OK)本身还包含了 一些特殊字符以及数字,下面将对这些格式进行说明。

  1. 发送命令的格式

RESP的规定一条命令的格式如下,CRLF代表"\r\n"。

*<参数数量> CRLF
$<参数1的字节数量> CRLF 

<参数1> 

CRLF ... 

$<参数N的字节数量> CRLF 

<参数N> CRLF

参数数量为3个,因此第一行为:

*3

参数字节数分别是355,因此后面几行为:

$3
SET 
$5
hello
$5
world

有一点要注意的是,上面只是格式化显示的结果,实际传输格式为如下代码:

*3\r\n$3\r\nSET\r\n$5\r\nhello\r\n$5\r\nworld\r\n

返回格式:

Redis的返回结果类型分为以下五种

·状态回复:在RESP中第一个字节为"+"。 
·错误回复:在RESP中第一个字节为"-"。 
·整数回复:在RESP中第一个字节为":"。
·字符串回复:在RESP中第一个字节为"$"。
·多条字符串回复:在RESP中第一个字节为"*"。
static sds cliFormatReplyTTY(redisReply *r, char *prefix)
 { sds out = sdsempty(); 
switch (r->type) 
  { 
     case REDIS_REPLY_ERROR: 
     // 处理错误回复 
     case REDIS_REPLY_STATUS: 
     // 处理状态回复 
    case REDIS_REPLY_INTEGER: 
    // 处理整数回复 
    case REDIS_REPLY_STRING: 
    // 处理字符串回复 
    case REDIS_REPLY_NIL: 
    // 处理空 
   case REDIS_REPLY_ARRAY: 
    // 处理多条字符串回复
    return out; 
}

那么直接用telnet和nc分别实现一下啊,直接弄用协议写一下。

redis 简单整理——客户端通信协议[十五]_字符串_03

redis 简单整理——客户端通信协议[十五]_返回结果_04

redis 简单整理——客户端通信协议[十五]_字符串_05

后面几个可以自己玩一下。

有一点需要注意,无论是字符串回复还是多条字符串回复,如果有nil 值,那么会返回$-1。

redis 简单整理——客户端通信协议[十五]_字符串_06

有了RESP提供的发送命令和返回结果的协议格式,各种编程语言就可 以利用其来实现相应的Redis客户端,后面两节将介绍Java和Python两个编程 语言的Redis客户端。

下一节Java客户端Jedis。