Redis是单进程,单线程的。应用系统和Redis通过Redis协议(RESP)进行交互
1 请求响应模式
Redis协议位于TCP层之上,即客户端和Redis实例保持双工的连接.1.1 串行的请求响应模式(ping-pong)
串行化是最简单模式,客户端与服务器端建立长连接,连接通过心跳机制检测(ping-pong) ack应答,客户端发送请求,服务端响应,客户端收到响应后,再发起第二个请求,服务器端再响应。telnet和redis-cli 发出的命令 都属于该种模式
特点:有问有答,耗时在网络传输命令,性能较低1.1.2 双工请求响应(pipeline)
批量请求,批量响应。请求响应交叉进行,不会混淆(TCP双工)
- pipeline的作用是将一批命令进行打包,然后发送给服务器,服务器执行完按顺序打包返回。
- 通过pipeline,一次pipeline(n条命令)=一次网络时间 + n次命令时间
Jedis redis = new Jedis("192.168.1.111", 6379);
redis.auth("12345678");//授权密码 对应redis.conf的requirepass密码
Pipeline pipe = jedis.pipelined();
for (int i = 0; i <50000; i++) {
pipe.set("key_"+String.valueOf(i),String.valueOf(i));
}
//将封装后的PIPE一次性发给redis
pipe.sync();
1.1.3 原子化的批量请求响应模式(事务)
Redis可以利用事务机制批量执行命令。1.1.4 发布订阅模式(pub/sub)
发布订阅模式是:一个客户端触发,多个客户端被动接收,通过服务器中转。1.1.5 脚本化的批量执行(lua)
客户端向服务器端提交一个lua脚本,服务器端执行该脚本。
2 请求数据格式(2种)
2.1 内联格式
[root@localhost bin]# telnet 127.0.0.1 6379
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
ping +PONG exists
name :1
2.2 规范格式(协议响应格式)
1、间隔符号,在Linux下是rn,在Windows下是n
2、简单字符串 Simple Strings, 以 "+"加号 开头
3、错误 Errors, 以"-"减号 开头
4、整数型 Integer, 以 ":" 冒号开头
5、大字符串类型 Bulk Strings, 以 "$"美元符号开头,长度限制512M
6、数组类型 Arrays,以 "*"星号开头
用SET命令来举例说明RESP协议的格式。
##查看持久化
vim appendonly.aof
3 命令处理流程
3.1 Server启动监听socket
启动调用 initServer方法:创建eventLoop(事件机制),注册时间事件处理器,注册文件事件(socket)处理器,监听 socket 建立连接3.2 建立client
redis-cli建立socket,redis-server为每个连接(socket)创建一个 Client 对象,创建文件事件监听socket,指定事件处理函数3.3 读取socket数据到输入缓冲区
从client中读取客户端的查询缓冲区内容。3.4 解析获取命令
将输入缓冲区中的数据解析成对应的命令,判断是单条命令还是多条命令并调用相应的解析器解析3.5 执行命令
解析成功后调用processCommand 方法执行命令。调用 lookupCommand 方法获得对应的 redisCommand,检测当前 Redis 是否可以执行该命令,调用 call 方法真正执行命令
4 协议解析及处理4.1 协议解析:
在Redis客户端键入命令后,Redis-cli会把命令转化为RESP协议格式,然后发送给服务器。服务器再对协议进行解析。
- 解析命令请求参数数量
- 循环解析请求参数
4.2 协议执行
协议的执行包括命令的调用和返回结果,判断参数个数和取出的参数是否一致,RedisServer解析完命令后,会调用函数processCommand处理该命令请求。quit校验,如果是“quit”命令,直接返回并关闭客户端,命令语法校验,执行lookupCommand,查找命令(set),如果不存在则返回:“unknown command”错误。参数数目校验,参数数目和解析出来的参数个数要匹配,如果不匹配则返回:“wrong number of arguments”错误。此外还有权限校验,最大内存校验,集群校验,持久化校验等等。校验成功后,会调用call函数执行命令,并记录命令执行时间和调用次数,如果执行命令时间过长还要记录慢查询日志。执行命令后返回结果的类型不同则协议格式也不同,分为5类:状态回复、错误回复、整数回复、批量回复、多条批量回复