客户端和服务器
redisServer 含redisClient链表
redisClient{
fd 套接字描述符
flags (如master,blocked)
querybuf (输入缓冲区,保存客户端发送命令)
argc (解析发送命令后的参数个数 3)
argv (解析发送命令后的参数数组 set msg hello)
redisCommand *cmd (解析后指向set命令实现)
输出缓冲区(保存回复)
authenticated (客户端是否通过身份验证(0或1),若为0,则除了auth命令其他命令都拒绝)
ctime 创建时间
lastinteraction 最后互动时间
…
}
AE_READABLE ,命令请求处理器:
读取socket数据(协议格式),保存redisClient输入缓冲区,解析argc , argv,调用命令执行器
命令执行器
1 根据argv[0],查找命令表,设置cmd属性
2 预备操作,检查cmd是否为null,参数个数是否正确,authenticated属性,如果打开maxmemory,是否需要内存回收
3 调用实现函数,回复写到redisClient输出缓冲区,AE_WRITABLE关联命令回复处理器
4 后续,如aof缓冲区写入,命令发送给从服务器
serverCron 100ms 执行一次,
更新服务器时间缓存(避免反复系统调用,但精度不高)
更新服务器每秒执行命令次数,内存峰值记录,处理sigterm信号(可能关闭服务器)
管理数据库资源(删除过期键)
初始化服务器
1 创建redisServer结构,默认值
2 载入用户配置参数和文件,修改默认值为新值
3 初始化服务器数据结构,设置信号处理函数,创建共享对象(1到10000),打开port…
4 载入aof(优先)或rdb,即aof开了用aof,没开rdb
5 执行事件循环
还没有评论,来说两句吧...