1. 客户端
- 服务器状态结构使用clients链表连接多个客户端状态,新添加的客户端状态会被放到链表末尾;
- 客户端状态的flags属性使用不同标志来表示客户端的角色,以及客户端当前所处的状态;
- 输入缓存区记录了客户端发送的命令请求,这个缓冲区的带下不能超过1GB;
- 命令的参数和参数个数会被记录在客户端端状态的argv和argc属性里面,而cmd属性则记录了客户端要执行命令的实现函数;
- 客户端有固定大小缓存区和可变大小缓存区两种缓存区可用、其中固定大小缓存区的最大大小为16KB,而可变大小缓冲区的最大大小不能超过服务器设置的硬性限制值;
- 输入超出缓冲区限制值有两种,如果输出缓冲区的带下超过了服务器设置的硬性限制,客户端会被立即关闭;除此之外,如果客户端在一定时间内、一直超过服务器设置的软性限制,那么客户端也会被关闭;
- 当一个客户端通过网络连接上服务器时,服务器会为这个客户端创建相应的客户端状态。网络连接关闭、发送了不合协议的命令请求、称为client kill命令的目标、空转时间超时、输出缓冲区的大小超出限制,以上这些原因都会造成客户端被关闭。
- 处理lua脚本的伪客户端在服务器初始化时被创建,这个客户端一直存在,直到服务器关闭;
- 载入AOF文件时使用的伪客户端在载入工作开始时动态创建,载入工作完毕之后关闭;
2. 服务端
Redis服务器负责与多个客户端建立网络连接,处理客户端发送的命令请求,在数据库中保存客户端执行命令产生的数据,并通过资源管理来服务器的自身运转。
一个命令请求从发送到完成主要包括以下步骤:
客户端将命令请求发送给服务器;
服务器将读取命令请求,并分析出命令参数;
命令执行器根据参数查找命令的实现函数,然后执行实现函数并得出命令回复;
服务器将命令回复返回给客户端。
serverCron函数默认每隔100毫秒执行一次,它的工作主要包括更新服务器状态信息,处理服务器接收的SIGTERM信号,管理客户端资源和数据库状态,检查并执行持久化操作等等;
服务器从启动到能够处理命令需要执行以下步骤:
- 初始化服务器状态;
- 载入服务器配置;
- 初始化服务器数据结构;
- 还原数据库状态;
- 执行事件循环。