redis(13)服务器

2019-09-26  本文已影响0人  大飞飞_s8

1、命令请求的执行过程

1.1、客户端向服务器发送命令请求set key value

1.2、服务器接收并处理客户端发送来的命令,在数据库中进行设置,并产生命令回复

1.3、服务器将命令回复发送给客户端

1.4、客户端收到服务器命令回复,并将这个回复打印给用户

2、发送命令请求

客户端会将命令请求转换成协议格式,然后通过连接到服务器的套接字,将协议格式的命令请求发送给服务器

3、读取命令请求

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

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

3)、调用命令执行器,执行客户端制定命令

3、命令执行器

1)、首先根据客户端状态的argv[0]参数,在命令表(command table) 中查找参数所指定的命令,并将找到的命令保存到客户端状态的cmd属性里面,命令表是一个字典

命令名字大小写不影响结果

2)、执行预备操作

检查cmd指针是否指向null,null则不执行后续步骤

cmd找到redisCommand结构的artity属性,检查命令请求所给定的参数个数是否正确,比如artity=-3,那么输入参数个数必须大于等于3

验证身份

如果开启maxmemory功能,那么检查内存占用情况,需要时,进行回收

如果客户端正在使用subscribe命令订阅频道,或者正在用psubscribe订阅,那么服务器只会执行客户端发来的subscribe psubscribe unsubscribe unpsubscribe

如果服务器正在进行数据载入,那么客户端发送命令必须带有标志1

如果服务器因为执行lua脚本而超时并进入阻塞状态,那么服务器只会执行客户端发来的shutdown nosave 和 script kill 命令,其他被拒绝

如果服务器正在执行事务,那么服务器只会执行客户端发来的exec discard multi watch 四个命令,其他的被放进事物队列

如果服务器打开监视器功能,则将要执行的命令发送给监视器

当完成以上预备操作之后,服务器就可以开始真正执行命令了

3)、调用命令的实现函数

4)、执行后续工作

如果开启慢日志查询,则判断是否需要记录慢日志

根据命令所耗费时长,更新被执行命令的redisCommand结构的milliseconds属性,并将命令的redisCommand结构的calls计数器的值增一

如果开启aof持久化,则写入aof缓冲区

如果从服务器正在复制当前服务器,则服务器将执行的命令传播给所有从服务器

4、serverCron函数

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

serverCron每隔100毫秒一次的频率更新unixtime属性和mstime属性,当前时间,所以这两个属性记录的时间精度不高

5、初始化服务器

1)、初始化服务器状态结构

2)、载入配置选项

3)、初始化服务器数据结构

4)、还原数据库状态

上一篇下一篇

猜你喜欢

热点阅读