redis 服务器

redis服务器

服务器启动初始化过程

  1. 初始化redis Server结构体的状态:initServerConfig函数内。包括设置运行Id,设置默认运行频率,设置配置文件路,设置端口号,设置RDB和AOF持久化条件,初始化lru时钟和创建命令表(即客户端传来的命令字符串和实际执行命令的函数等信息结构体之间的哈希表,字符串不区分大小写)。
  2. 载入配置项:通过终端输入和配置文件的内容,替换server的配置
  3. 初始化服务器数据结构(这里指server内的数据结构,而不是简单变量):在initServer函数内。包括client的链表,db数组,保存频道订阅信息的pubsub_channels字典,pubsub_patterns链表,lua环境,慢日志slowlog属性,创建共享对象(常用字符串和0-9999的数字,这里和书中记载不一致,因为对象共享一节说是0-9999,需要考证),为serverCron函数创建事件事件,初始化后台I/O模块等

服务器定时任务serverCron执行详解

serverCron默认每100毫秒执行一次,更新服务器的各种属性,每次执行,会做以下事情:
1. 更新服务器时间缓存:因为每一次获取时间都是一次系统调用,所以redis会自己缓存一份时间,因为是缓存的,更新不及时,所以只在对时间要求不精确的时候使用,例如:打印日志,更新服务器LRU时钟,计算服务器上线时间等,而对于键过期事件,慢查询日志还是会重新获取事件
2. 更新LRU时钟:也是一个事件,用于计算对象的空转时间,每个redis对象都有lru时间戳,计算空转事件通过服务器lru时钟减去对象lru时间戳得出
3. 更新服务器每秒执行命令次数:调用tractoperationPersecond函数,用于估算服务器最近一秒处理的命令请求次数
4. 更新服务器内存峰值记录:一个值,每次比较更新为服务器运行依赖的最大值
5. 处理进程的SIGTERM信号:服务器进程初始化的时候,会为进程SIGTERM信号关联处理器sigtermHandler函数,这个函数将拦截SIGTERM信号,然后将一个标志位置1。定时器会检查该标志位,然后执行关闭服务器操作,并执行持久化等后续操作。
6. 管理客户端资源:关闭过期客户端,检查客户端输入缓冲区,如有必要清空它
7. 管理数据库资源:清空过期键,这是个分批的,持续的操作,前面章节有讲
8. 执行延迟的BGREWRITEAOF命令:如果服务器在执行BGSAVE,则BGREWRITEAOF命令会延期,server结构体内一个标志位置1,serverCron将检测是否在执行BGSAVE和是否有延期的BGREWRITEAOF命令,符合条件会执行它
9. 检查持久化运行情况:redis服务器有字段保存rdb持久化和AOF持久化的子进程id(id == -1.代表没有持久化进程),当serverCron检查发现有持久化进程运行的时候,会执行wait3函数,检查子进程有无信号发到服务器进程,有的话,说明持久化完成,则进行后续操作,比如替换旧文件。如果没有持久化进程,serverCron会检查(1)是否有BGREWRITEAOF,(2)自动保存条件是否满,(3)AOF重写条件是否满足,从而进行RDB持久化或者AOF重写
10. 写AOF缓存到AOF文件
11. 关闭客户端输出缓冲区超出限制的客户端
12. 更新serverCron执行计数器

服务器执行客户端命令流程

  1. 客户端发送请求:该请求将会转换成协议格式,通过套接字发送到服务器,服务器产生文件事件,进而触发命令请求处理器(见文件事件->要点)
  2. 读取命令请求:命令请求处理器将会把客户端输入缓冲区的内容解释出命令和命令参数,保存到客户端的属性argv和argc中(见redis客户端->命令与命令参数字段),之后调用命令执行器
  3. 命令执行器的四个步骤:
    1. 查找命令实现的函数:redis服务器中包含一个命令字典,是一个字符串到redisCommand结构体的映射,通过它,可以将客户端字符串形式的命令,映射到一个redisCommand结构体上,结构体有实际需要的函数和函数执行计数器,函数所需参数个数等函数属性。之后redis客户端中的cmd属性将指向这个结构体
    2. 执行预备操作:运行命令前的检查:检测cmd属性是否为null,以及通过redisCommand结构体提供的参数检测参数个数是否足够,redis客户端授权字段是否为1,服务器是否在某几个特殊命令下或者特殊状态上无法执行给定命令,以及检测服务器标志,执行标志定义的函数等
    3. 调用实现函数:传入client结构体,调用实现函数
    4. 执行后续操作:比如视情况记录慢日志,将执行耗时、计数记录到redisCommand结构体,更新AOF缓存,在集群中广播写事件等
  4. 将命令回复给客户端:新绑定的文件事件触发命令回复处理器,将回复转化成协议格式写入客户端输出缓冲区,这时需要检查输出缓冲区的大小,防止过大。

猜你喜欢

转载自blog.csdn.net/lqadam/article/details/79429587