socket协议向客户端发送命令_Redis的通讯协议及事件处理机制

Redis的通信协议

Redis是单进程 单线程的, 应用系统和Redis通过Redis协议(RESP)进行交互
  • 请求响应模式

Redis协议位于TCP层之上,即客户端和Redis实例保持双工的连接。

2c98af31950b78f9178f08266c14a927.png

串行的请求响应模式(ping-pong)

串行化是最简单模式,客户端与服务器端建立长连接,连接通过心跳机制检测(ping-pong) ack应答, 客户端发送请求,服务端响应,客户端收到响应后,再发起第二个请求,服务器端再响应

39e0d71059de58c5f2aa729751b7d118.png
telnet和redis-cli 发出的命令 都属于该种模式
特点:有问有答, 耗时在网络传输命令,性能较低

双工的请求响应模式(pipeline)

批量请求,批量响应,请求响应交叉进行,不会混淆(TCP双工),pipeline。
pipeline的作用是将 一批命令进行打包,然后发送给服务器,服务器执行完按顺序打包返回;
通过pipeline,一次pipeline(n条命令)=一次网络时间 + n次命令时间。

e6e8fde6d68aa8b8612176e7fc2385a5.png

请求数据格式

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,以 "*"星号开头。

4c0845b65b3c61d8637ccfb7f24cd0e8.png
发送命令

60cef601be6595ce8749d4c21ef52947.png
实际发送内容

b7a6178dc1f88c72158d7f87d7555256.png
实际返回命令

命令处理流程

042bfee4162ce60eb6bce5492c87acdd.png
Server启动时监听socket
启动调用 initServer方法:
创建eventLoop(事件机制)
注册时间事件处理器
注册文件事件(socket)处理器
监听 socket 建立连接 建立Client
redis-cli建立socket;
redis-server为每个连接(socket)创建一个 Client 对象;
创建文件事件监听socket;
指定事件处理函数。 读取socket数据到输入缓冲区:从client中读取客户端的查询缓冲区内容。 解析获取命令
将输入缓冲区中的数据解析成对应的命令;
判断是单条命令还是多条命令并调用相应的解析器解析。 执行命令:解析成功后调用processCommand 方法执行命令,大致分为
调用 lookupCommand 方法获得对应的 redisCommand;
检测当前 Redis 是否可以执行该命令;
调用 call 方法真正执行命令&#
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值