命令请求的执行过程
- 1.客户端通过socket发送命令
- 2.服务器端通过io多路复用器捕捉到socket,然后解析出对应的命令保存到客户端状态的输入缓冲区
- 3.对输入缓冲区命令解析,解析的结果保存到客户端状态的argv和argc属性
- 4.调用命令执行器,执行客户端命令。
- 5.命令执行器根据指令名称去命令表寻找指定的命令,找到后就执行,找不到就返回错误。
- 6.如果开启了慢查询功能,则记录命令执行的日志,可能还有AOF等。
- 7.执行完毕的结果放入到输出缓冲区,然后执行命令回复。回复完毕清空输出缓冲区。
serverCron函数(每100毫秒执行一次)
- 1.更新服务器时间缓存(redis服务器中获取当前时间其实大部分都是获取的缓存,底层有serverCron更新时间,避免无数的系统调用)
- 2.更新LRU时钟的,每个redis对象都保存一个lru属性,然后计算空转时间就是拿LRU时钟减去lru属性。
- 3.更新服务器每秒执行的命令次数,主要是抽样计算
- 4.更新服务器内存峰值记录
- 5.处理SIGTERM信号,该信号接收到之后设置关闭标志,而serverCron每次执行都会检查该标志,如果是关闭则开始关闭服务器
- 6.清理过期的客户端连接,调整输入缓冲区大小。
- 7.执行被延迟的BGREWRITEAOF
- 8.检查持久化操作的运行状态
- 9.将AOF缓冲区内容写入AOF文件
- 10.关闭异常客户端
初始化服务器
- 1.先创建redisServer
- 2.载入配置选项
- 3.初始化服务器数据结构
- 4.初始化服务器的数据结构,比如客户端的链表,数据库数组等
- 5.还原数据库状态
- 6.执行主循环