文章目录
1. 概括
- Redis服务器是一对多服务器程序,一个服务器可以与多个客户端建立网络连接
- Redis的文件事件是由I/O多路复用技术实现的,Redis服务程序使用单线程单进程的方式处理命令请求,与多个客户端进行网络通信
- 服务器会为相连接的客户端建立redisClient结构,来记录客户端的状态信息等。
redisClient结构包含:
- 客户端的套接字描述
- 客户端的名字
- 客户端的标志值
- 指向客户端正在使用的数据库的指针,以及该数据库的号码
- 客户端的输入和输出缓冲区
- 客户端的复制状态信息
- 客户端的身份验证等
- 多个redisClient是以链表的形式存在服务器中的,redisServer中的clients指针指向这个链表
2 客户端属性
默认情况下,连接到服务器的客户端是没有名字的指向,NULL指针,可自己设置。
2.1 套接字描述符
客户端状态的 fd 属性记录了客户端正在使用的套接字描述符:
typedef struct redisClient {
// ...
int fd;
// ...
} redisClient;
- 伪客户端(fake client)的 fd 属性的值为 -1 : 伪客户端处理的命令请求来源于 AOF 文件或者 Lua 脚本, 而不是网络, 所以这种客户端不需要套接字连接, 自然也不需要记录套接字描述符。 目前 Redis 服务器会在两个地方用到伪客户端, 一个用于载入 AOF 文件并还原数据库状态, 而另一个则用于执行 Lua 脚本中包含的 Redis 命令。
- 普通客户端的 fd 属性的值为大于 -1 的整数: 普通客户端使用套接字来与服务器进行通讯, 所以服务器会用 fd 属性来记录客户端套接字的描述符。 因为合法的套接字描述符不能是 -1 , 所以普通客户端的套接字描述符的值必然是大于 -1 的整数。
2.2 标志
客户端的标志属性 flags 记录了客户端的角色(role), 以及客户端目前所处的状态,可由多个二进制表示。
typedef struct redisClient {
// ...
int flags;
// ...
} redisClient;
<