- redis服务端启动初始化的先后过程:
- 由redis.c/initServerConfig函数初始化服务器状态结构server(此结构为struct redisServer类型的实例变量),并为结构中的各个属性设置默认值,包括设置服务器的运行ID、运行频率、配置文件路径、运行架构、默认端口号、持久化条件、LRU时钟以及创建命令表等一般属性;
- 载入用户给定配置参数及配置文件,并对server对应默认属性进行更新;
- 调用initServer函数为以下数据结构分配内存并根据需要为其设置或管理初始化值:
- server.clients链表:记录所有与服务器相连的客户端的状态结构;
- serer.db数组:包含所有数据库;
- 保存频道订阅信息的server.pubsub_channels字典以及保存模式订阅信息的server.pubsub_patterns链表;
- server.lua:执行lua脚本的lua环境;
- server.slowlog:保存慢查询日志
- initServer还会进行一些非常重要的设置,包括:
- 为服务器设置进程信号处理器;
- 创建“OK”,“ERR"等常用共享对象,以避免重复创建;
- 打开服务器监听端口,为监听套接字关联应答事件处理器,等待服务器正式运行时接收客户端的连接;
- 打开或新建AOF文件,为AOF写入做好准备;
- 初始化后台I/O模块(bio),为将来的I/O做好准备
- 载入RDB或AOF文件还原数据库状态
- 打印ready to accept connections on port XXX,开始接收客户端的连接请求并处理;
- 客户端发送请求命令到得到回复处理的全执行过程:
- 客户端将redis命令转化成协议格式并发送到服务端;
- 服务端读取协议格式数据并保存到客户端状态的输入缓冲区;
- 对输入缓冲区的数据jinx 分析,提取出命令、参数及参数个数;
- 根据命令在命令表中查找对应的redisCommand对象;
- 预备及执行前的检测工作:包括参数个数、用户身份、服务器内存占用量、订阅检查、服务器是否正载入、是否开监视器等;
- 执行redisCommand里的方法,并把回复信息保存到客户端状态的输出缓冲区;
- 执行后回复前的检测工作:是否增加到慢查询、更新命令耗时及计数器、根据需要写到AOF、必要的命令传播到从服务器;
- 将输入缓冲区里的回复数据发送到客户端
- serverCon函数默认每隔100毫秒执行一次,负责管理服务器资源,其主要执行以下操作:
- 更新服务器时间缓存unixtime、mstime;
- 更新LRU时钟;
- 更新服务器每秒执行命令次数;
- 更新服务器内存峰值记录;
- 处理关闭sigterm信号,主要为了关闭前做一些持久化;
- 管理客户端资源,包括检查客户端与服务端之间连接是否超时、释放过长的客户端缓冲区;
- 管理数据库资源,调用databaseCron函数对一些数据库检查,删除过期键,并根据需要进行字典收缩;
- 执行因bgsave被延迟的bgrewriteaof;
- 检查持久化操作的运行状态,包括是否完成、是否正在进行或是否需要进行持久化等;
- 如果开启了AOF,将AOF缓冲区中的内容写到AOF文件;
- 关闭输出缓冲区大小超过显示的客户端;
- 增加记录serverCron函数执行次数的cronloops计数器值
以上文字来自Dimmacro,转载请说明来源:http://www.cnblogs.com/dimmacro/