客户端
服务端保存的客户端状态:(redisClient
)
- 套接字;
- 客户端名字
- 标志值flag;
- 正在使用的数据库指针\号码;
- 客户端当前要执行的命令、参数..;
- 客户端输入、输出缓冲区;
- 复制状态信息;
- 事务状态;
- 身份验证标志:0未通过;1:已经通过身份验证;
- 创建时间、最后一次通信时间;
- 其他。
1 | struct redisServer{ |
相关命令
列出客户端:
1 | 127.0.0.1:6379> client list |
套接字fd
fd=-1: 伪客户端:加载AOF或执行Lua脚本;
fd>-1: 普通客户端。
名字(name)
默认都没有名字,可以使用client setname
命令设置。
客户端关闭
关闭的原因:
- 客户端进程退出、被杀死(
Client kill
),网络连接断开; - 客户端发送了不符合协议格式的命令,被关闭;
- 空转时间超过
timeout
配置; - 发送命令大小超过输入缓冲区限制;
- 回复命令大小超过输出缓冲区限制。
输出缓冲区需满足的两个限制:
- 硬性限制:超出硬性限制大小,立即关闭;
- 软性限制:最多可以超出软性限制持续时长xxx秒。
示例配置:
1 | 普通客户端硬性限制和软性限制都不限制: |
服务端
命令的执行流程
- 用户=>客户端: 输入命令;
- 客户端=>服务端: 命令按通信协议传输到服务器输入缓冲区;
- 服务端: 等待可读事件发生后,读输入缓冲区,解析命令;
- 服务端:执行命令,将回复写入输出缓冲区;
- 服务端=>客户端:等待可写事件发生后,从输出缓冲区传输给客户端。
- 客户端=>用户: 回显命令结果。