一、命令请求的执行过程

1、发送命令请求

redis(9)——服务器端

2、读取命令请求

        1)读取套接字中协议格式的命令请求,并将其保存到客户端状态的输人缓冲区里面。

        2)对输人缓冲区中的命令请求进行分析,提取出命令请求中包含的命令参数,以及命令参数的个数,然后分别将参数和参数个数保存到客户端状态的argv属性和argc属性里面。

        3)调用命令执行器,执行客户端指定的命令。

3、命令执行器(1):查找命令实现   

        命令执行器要做的第一件事就是根据客户端状态的argv[0]参数,在命令表(command table )(命令表是一个字典,字典的键是一个个命令名字)中查找参数所指定的命令,并将找到的命令保存到客户端状态的cmd属性里面。

4、命令执行器(2):执行预备操作——《redis设计与实现》P182

5、命令执行器(3):调用命令的实现函数

6、命令执行器(4):执行后续工作

7、将命令回复发送给客户端

8、客户端接收并打印命令回复

redis(9)——服务器端

二、serverCron函数

        Redis服务器中的serverCron函数默认每隔100毫秒执行一次,这个函数负责管理服务器的资源,并保持服务器自身的良好运转。

更新服务器时间缓存

更新LRU时钟

更新服务器每秒执行命令次数

更新服务器内存峰值记录

 处理SIGTERM信号

管理客户端资源

        如果客户端与服务器之间的连接已经超时(很长一段时间里客户端和服务器都没有互动),那么程序释放这个客户端。

        如果客户端在上一次执行命令请求之后,输入缓冲区的大小超过了一定的长度,那么程序会释放客户端当前的输入缓冲区,并重新创建一个默认大小的输人缓冲区,从而防止客户端的输入缓冲区耗费了过多的内存。

管理数据库资源

执行被延迟的BGREWRITEAOF

        在服务器执行BGSAVE命令的期间,如果客户端向服务器发来BGREWRITEAOF命令,那么服务器会将BGREWRITEAOF命令的执行时间延迟到BGSAYE命令执行完毕之后。

检查持久化操作的运行状态

redis(9)——服务器端

将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文件来还原数据库状态。

状态执行事件循环

相关文章:

  • 2021-04-30
  • 2021-05-26
  • 2021-06-09
  • 2021-12-22
猜你喜欢
  • 2021-10-06
  • 2021-07-19
  • 2021-03-31
  • 2021-08-25
  • 2022-12-23
  • 2021-08-13
  • 2022-12-23
相关资源
相似解决方案