redis客户端的创建与关闭
创建普通客户端
客户端通过网络连接与服务器进行连接的普通客户端,在客户端使用connect函数连接到服务器时,服务器就会调用连接事件处理器,为客户端创建相应的客户端状态,并将这个新的客户端状态添加到服务端结构中的clients链表的末尾。
关闭普通客户端
普通客户端关闭原因:
- 客户端进程退出或被杀死,客户端与服务器之间的网络连接将被关闭,造成客户端被关闭
- 客户端向服务器发送带有不符合协议格式的命令请求,客户端也会被服务器关闭
- 客户端是CLIENT KILL命令的目标,将会被关闭
- 用户为服务器设置了timeout配置选项,客户端的空转时间超过timeout设置的值,客户端将被关闭。
- 客户端发送命令请求超过输入缓冲区的限制大小(默认1GB),客户端就会被服务器关闭
- 发送客户端的命令回复的大小超过了输出缓冲区的限制大小,客户端会被关闭
输出缓冲区是可变大小缓冲区,但为了避免客户端回复过大,占用过多的服务器资源,服务器会时刻检查客户端的输出缓冲区的大小,并在缓冲区大小超出范围时进行限制:
硬性限制:超过硬性限制设置的大小,服务器立即关闭客户端
软性限制:超过软性限制设置的大小,服务器记录客户端到达软性限制的时间,并继续监视客户端,如果输出缓冲区一直超过软性限制,持续时间超过服务器设定的时长,服务器关闭客户端。如果不超过软性限制,客户端不会被关闭,并将记录的时间清零
伪客户端的关闭
服务器在初始化时创建负责执行lua脚本中redis命令的伪客户端,并将伪客户端关联的服务器记录在redisServer结构中的lua_client属性中,在服务器运行时一直存在,在服务器关闭的时候这个伪客户端才会关闭
服务器在载入AOF文件时,创建用于执行AOF文件包含的redis命令的伪客户端,载入完成后关闭伪客户端