Redis的通信协议
Redis是单进程 单线程的, 应用系统和Redis通过Redis协议(RESP)进行交互。
- 请求响应模式
Redis协议位于TCP层之上,即客户端和Redis实例保持双工的连接。
串行的请求响应模式(ping-pong)
串行化是最简单模式,客户端与服务器端建立长连接,连接通过心跳机制检测(ping-pong) ack应答, 客户端发送请求,服务端响应,客户端收到响应后,再发起第二个请求,服务器端再响应。
telnet和redis-cli 发出的命令 都属于该种模式
特点:有问有答, 耗时在网络传输命令,性能较低
双工的请求响应模式(pipeline)
批量请求,批量响应,请求响应交叉进行,不会混淆(TCP双工),pipeline。
pipeline的作用是将 一批命令进行打包,然后发送给服务器,服务器执行完按顺序打包返回;
通过pipeline,一次pipeline(n条命令)=一次网络时间 + n次命令时间。
请求数据格式
Redis客户端与服务器交互采用 序列化协议(RESP),请求以 字符串数组的形式来表示要执行 命令的参数。用命令特有(command-specific)数据类型作为回复。 通信协议的特点
客户端和服务器通过 TCP 连接来进行数据交互, 服务器默认的端口号为 6379 。
客户端和服务器发送的命令或数据一律以 rn (CRLF)结尾。
在这个协议中, 所有发送至 Redis 服务器的参数都是 二进制安全(binary safe)的。
简单,高效,易读。 规范格式
1、间隔符号,在Linux下是rn,在Windows下是n;
2、简单字符串 Simple Strings, 以 "+"加号 开头;
3、错误 Errors, 以"-"减号 开头;
4、整数型 Integer, 以 ":" 冒号开头;
5、大字符串类型 Bulk Strings, 以 "$"美元符号开头,长度限制512M;
6、数组类型 Arrays,以 "*"星号开头。
命令处理流程
Server启动时监听socket
启动调用 initServer方法:
创建eventLoop(事件机制)
注册时间事件处理器
注册文件事件(socket)处理器
监听 socket 建立连接 建立Client
redis-cli建立socket;
redis-server为每个连接(socket)创建一个 Client 对象;
创建文件事件监听socket;
指定事件处理函数。 读取socket数据到输入缓冲区:从client中读取客户端的查询缓冲区内容。 解析获取命令
将输入缓冲区中的数据解析成对应的命令;
判断是单条命令还是多条命令并调用相应的解析器解析。 执行命令:解析成功后调用processCommand 方法执行命令,大致分为
调用 lookupCommand 方法获得对应的 redisCommand;
检测当前 Redis 是否可以执行该命令;
调用 call 方法真正执行命令&#