Redis服务器使用单线程单进程方式处理命令请求,并与多个客户端进行网络通信。
客户端创建
客户端使用connect函数链接到服务器时,服务器就会调用连接事件处理器,创建redisClient obj,将这个obj放到 redisServer.clients链表的末尾。
redisServer{
sds aof_buf; // AOF缓冲区
redis *db; // 数据库
int dbNum; // 数据库个数
clients; // redis客户端链表
}
客户端
redisClient {
int fd; // 客户端socket的描述符,当客户端是来自aof或者lua,该值为-1
rojb *name; // 客户端名字
int flags; // 客户端角色,详见下方举例说明
ctime; // 客户端创建时间
sds querybuf; // 客户端的命令,默认最大1GB
int authenticated; // 客户端身份验证 , 0表示未通过验证,只能接收AUTH命令
robj *argv; // 客户端的命令解析后的参数,例如set age 18:argv[0]=set,argv[1]=age,argv[2]=10
int argv; // 客户端的命令解析后的参数个数,例如set age 18的argv=3而不是2
struct redisCommand; // 根据argv[0]找到对应的cmd
char buf[REDIS_REPLY_CHUNK_BYTES]; // 固定大小的输出缓冲区,默认16KB
list *reply; // 可变大小的输出缓冲区 当buf用完,或者放不下时启用
int bufpos; // 输出缓冲区大小
lastinteraction; // 客户端与服务端最后一次交互时间
obuf_soft_limit_reached_time; // 见下文“输出缓冲区”说明
}
flags举例
REDIS_MASTER:表示客户端是一个主服务器
REDIS_MULTI:表示客户端正在执行事务
REDIS_FORCE_AOF:表示强制将此命令写入AOF文件
输出缓冲区
业务场景举例 | hardlimit, softlimt, obuf_soft_limit_reached_time | 说明 |
normal(普通场景) | 0,0,0 | 不限制客户端输出缓冲区 |
slave(主从复制) | 256mb,64mb,60 | 当输出缓冲区超过256mb,与客户端断开 当输出缓冲区超过64mb的时长超过60s,与客户端断开 |
pubsub(消息系统) | 32mb,8mb,60 | 当输出缓冲区超过32mb,与客户端断开 当输出缓冲区超过8mb的时长超过60s,与客户端断开 |
客户端关闭
客户端关闭场景:
客户端退出
客户端发了不符合协议的命令
客户端空转时间超过了timeout设置的时间
输出缓冲区超过了限制,见上文“输出缓冲区”说明
本文暂时没有评论,来添加一个吧(●'◡'●)