美文网首页
redis(13)服务器

redis(13)服务器

作者: 大飞飞_s8 | 来源:发表于2019-09-26 19:39 被阅读0次

    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)、还原数据库状态

    相关文章

      网友评论

          本文标题:redis(13)服务器

          本文链接:https://www.haomeiwen.com/subject/uptquctx.html