- Redis使用I/O多路复用技术实现的文件事件处理器,对于每个与服务器进行连接的客户端,服务器都为这些客户端建立了相应的redisClient结构
- redis服务器状态结构的clients属性是一个链表,保存了所有与服务器连接的客户端的状态结构
一、客户端属性
- 比较通用的属性
- 与特定功能相关的属性
- 接下来介绍一个比较重要的属性
1. 输入缓冲区
- 客户单状态的输入缓冲区用于保存客户端发送的命令请求。
- 输入缓冲区的大小会根据输入内容动态的缩小或者扩大,但它的最大大小不超过1GB,否则服务器将关闭这个客户端
2. 命令与命令参数
- 在服务器将客户端发送的命令请求保存到客户端状态的querybuf属性之后,服务器将对命令请求的内容进行分析,并将得出的命令参数以及命令参数的个数分别保存到客户端状态的argv和argc属性。
- argv属性是一个数组,数组中的每个项都是一个字符串对象,其中argv[0]是要执行的命令,而之后的其他项则是传给命令的参数
- argc属性则负责记录argv数组的长度
3. 命令的实现函数
- 当服务器从协议内容中分析并得出argv和argc之后,服务器将根据项argv[0]的值,在命令表中查找命令所对应的命令实现函数。
- 命令表是一个字典,key是SDS,值是命令所对应的redisCommand结构,保存了命令的实现函数、命令的标志、命令应该给定的参数个数、命令的中执行次数和总耗时长等统计信息。
- 当程序找到argv[0]所对应的redisCommand结构,那么在服务器端的客户端状态的cmd多久指向这个结构,之后,执行cmd中的实现函数,进行处理。
- set命令的实现函数
4. 输出缓冲区
- 每个客户端都有两个缓冲区
- 固定大小的缓冲区用于保存哪些长度比较小的回复,最大大小为16KB
- 可变大小的缓冲区用于保存哪些长度比较大的回复
二、客户端创建和关闭
1. 普通客户端的创建
- 如果客户端是通过网络连接与服务进行连接的普通客户端,那么服务器会为客户端创建客户端状态,为了保存客户端的一些属性,以及在交互的时候,进行缓存数据等等,并将这个新的客户端状态添加到服务器状态中用于保存客户端状态的链表clients中。
1. 普通客户端的关闭
- 当一个客户端通过网络连接连上服务器时,服务器会为这个客户端创建客户端状态。网络连接关闭,发送了不合法协议格式的命令请求,成为CLIENT KILL命令的目标,空转时间超时、输出缓存区的大小超出限制,都会造成客户端的关闭
3. Lua脚本的伪客户端
- 处理Lua脚本的伪客户端在服务器初始化时创建,这个客户端会一直存在,知道服务器关闭。
4. AOF文件的伪客户端
- 服务器在载入AOF文件时,会创建用于执行AOF文件包含的Redis命令的伪客户端,并在载入完成之后,关闭这个客户端。