服务器的数据结构中包含了所有的客户端数据结构
typedef struct redisServer{
...
redisClient *client;
redisClient *lua_client;
...
}
客户端的结构体
typedef struct redisClient{
int fd;
robj *name;
int flags;
sds querybuf;
robj **argv;
int argc;
struct redisCommand *cmd;
char buf[REIDS_REPLY_CHUNK_BYTES];
int bufpos;
list *reply;
int authenticated;
time_t ctime;
time_t lastinteraction;
time_t obuf_soft_limit_reached_time;
}
1. fd
- 套接字描述符
- 取值可以是-1 和大于-1的整数
- -1:表示伪客户端,指命令请求来源于AOF文件或Lua脚本,而不是网络。
- 大于-1的整数:表示网络请求
2. name
- 客户端名字
3. flags
- 是个位图。可以同时取多个标志
- 标志的分类如下
- REDIS_MASTER: 主服务器的客户端
- REDIS_SLAVE:从服务器的客户端
- REDIS_LUA_CLIENT: lua脚本的伪客户端
- REDIS_MONITOR: 表明客户端正在执行MONITOR命令
- REDIS_UNIX_SORCKET:表示服务器用unix套接字连接客户端
- REDIS_BLOCKED:表示客户端被BRPOP,BLPOP等命令阻塞
- REDIS_UNBLOCKED:表示已经从阻塞中恢复
- REDIS_MULTI:表示正在执行事务
- REDIS_DIRTY_EXEC:表示事务在目录入队列时出现错误
- REDIS_DIRTY_CAS:表示事务所监视的key已被修改
- REDIS_CLOSE_ASAP:表示客户端输出缓冲区大小超过限制
- REDIS_CLOSE_AFTER_REPLY:表示有用户对这个客户端执行了kill命令
- REDIS_ASKING:表示该客户端向集群发送了ASKING命令
- REDIS_FORCE_AOF:表示强制服务器将当前命令写入到AOF文件里面
- REDISFORCE_REPL:表示强制主服务器将当前执行命令赋值给所有服务器。
4.querybuf
- 输入缓冲区
- 是sds类型
5. argv
- 参数数组
- 将querybuf中的内容分析,得出参数
6. argc
- 参数个数
7. cmd
- 命令的实现函数
- 根据argv中去查找命令字典得出
8. buf[]
- 固定大小的输出缓冲区
- 当输出内容比较少时使用
9. bufpos
- 固定缓冲区中已经使用的字节数
10. reply
- 可变大小的输出缓冲区
- 是个字符串列表
11. authenticated
- 表示客户端是否通过身份验证
- 0:未通过
- 1:通过
12. ctime
- 客户端创建时间
13. lastinteraction
- 记录该客户端与服务器最后一次互动的时间
14. obuf_soft_limit_reached_time
- 记录输出缓冲区第一次达到软性质限制的时间。