一、命令请求的执行过程
1、发送命令请求
2、读取命令请求
1)读取套接字中协议格式的命令请求,并将其保存到客户端状态的输人缓冲区里面。
2)对输人缓冲区中的命令请求进行分析,提取出命令请求中包含的命令参数,以及命令参数的个数,然后分别将参数和参数个数保存到客户端状态的argv属性和argc属性里面。
3)调用命令执行器,执行客户端指定的命令。
3、命令执行器(1):查找命令实现
命令执行器要做的第一件事就是根据客户端状态的argv[0]参数,在命令表(command table )(命令表是一个字典,字典的键是一个个命令名字)中查找参数所指定的命令,并将找到的命令保存到客户端状态的cmd属性里面。
4、命令执行器(2):执行预备操作——《redis设计与实现》P182
5、命令执行器(3):调用命令的实现函数
6、命令执行器(4):执行后续工作
7、将命令回复发送给客户端
8、客户端接收并打印命令回复
二、serverCron函数
Redis服务器中的serverCron函数默认每隔100毫秒执行一次,这个函数负责管理服务器的资源,并保持服务器自身的良好运转。
更新服务器时间缓存
更新LRU时钟
更新服务器每秒执行命令次数
更新服务器内存峰值记录
处理SIGTERM信号
管理客户端资源
如果客户端与服务器之间的连接已经超时(很长一段时间里客户端和服务器都没有互动),那么程序释放这个客户端。
如果客户端在上一次执行命令请求之后,输入缓冲区的大小超过了一定的长度,那么程序会释放客户端当前的输入缓冲区,并重新创建一个默认大小的输人缓冲区,从而防止客户端的输入缓冲区耗费了过多的内存。
管理数据库资源
执行被延迟的BGREWRITEAOF
在服务器执行BGSAVE命令的期间,如果客户端向服务器发来BGREWRITEAOF命令,那么服务器会将BGREWRITEAOF命令的执行时间延迟到BGSAYE命令执行完毕之后。
检查持久化操作的运行状态
将AOF缓冲区中的内容写入AOF文件
关闭异步客户端
服务器会关闭那些输出缓冲区大小超出限制的客户端
增加cronloops计数器的值
服务器状态的cronloops属性记录了serverCron函数执行的次数
三、初始化服务器
初始化服务器状态结构
设置服务器的运行ID}
设置服务器的默认运行频率。
设置服务器的默认配置文件路径。
设置服务器的运行架构。
设置服务器的默认端口号。
设置服务器的默认RDB持久化条件和AOF持久化条件。
初始化服务器的LRU时钟。
创建命今表。
载入配置选项
载入用户给定的配置参数和配置文件,并根据用户设定的配置,对server变量相关属性的值进行修改。
初始化服务器数据结构
server.clients链表,这个链表记录了所有与服务器相连的客户端的状态结构,链表的每个节点都包含了一个redisClient结构实例。
server.db数组,数组中包含了服务器的所有数据库。
用于保存频道订阅信息的。erver.pubsub_channels字典,以及用于保存模式订阅信息的。erver.pubsub_patterns链表。
用于执行Lua脚本的Lua环境server.lua。
用于保存慢查询日志的server.slowlog属性。
还原数据库
如果服务器启用了AOF持久化功能,那么服务器使用AOF文件来还原数据库状态。
如果服务器没有启用AOF持久化功能,那么服务器使用RDB文件来还原数据库状态。
状态执行事件循环