• 服务器


    发送命令请求:

    (1)当客户端向服务器发送命令的时候,客户端首先会将命令请求转化哪位协议格式,然后发送给服务器

    (2)server读取命令请求,进行解析,解析出argv和argc,并且将数据保存到输入缓冲区

    (3)查找命令实现,查找命令对应的函数。

    (4)执行预备操作

    比如执行cmd指针指向的是否是nULL,检查argc参数个数是否匹配,是否进行了客户端验证,是否打开了maxmemory并且检查

    (5)调用函数实现

    (6)执行后续操作,比如写入AOF,传给其他服务器之类的

    (7)将命令回复给客户端“”+OK “

    (8)客户端接收并打印

    服务器状态:

    我们在执行的过程中经常用到时间这个概念,

    redisserver{

    time_t unixtime

    long long mtime

    }

     因为使用时间都需要进行一次系统调用,非常消耗性能,所以我们在redisserver里面设置了这两个变量,每一次100毫秒执行servercron函数的时候都会更新这两个变量

    对于一些功能不高的我们会使用这两个变量的值,如果需要非常高的时候,比如我们需要设置过期时间的话,需要一定的精度

    idle的计算

    服务器状态中有一个lruclock属性,他和上面的类似,但是他是每隔10毫秒精度更好

    对于每一个redisobject我们都有一个lru表示最后操作时间,所以计算idle就是这两个值得差

    计录内存峰值,每一次都会和记录内存峰值的变量进行比较,如果增加的话,那么会更新

    处理SIGTERM信号,服务器讲这个信号和一个函数关联,这和函数里面会将一个变量设置为1,当执行servercron的时候会检查这个值,如果这个值为1的话,那么就会执行关闭。。。。之所以我们要对这个信号拦截,是因为我们需要在关闭之前执行RDB持久化,否则的话我们没等之星持久化操作就是关闭server了

    管理客户单资源:

    我们每次执行servercron的时候都会遍历所有client,都会查看所有的客户端是否断开。并且如果上一次的输入缓冲区的大小大于1GB,那么会释放并且重新创建一个空的缓冲区

    执行被延迟的BGREWRITEAOF:

     

     服务器启动

    (1)初始化服务器状态

    (2)载入配置

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

    (4)还原数据库状态

  • 相关阅读:
    BZOJ1057:[ZJOI2007]棋盘制作——题解
    洛谷4147:玉蟾宫——题解
    洛谷1578:[WC2002]奶牛浴场——题解
    BZOJ1926:[SDOI2010]粟粟的书架——题解
    BZOJ3123:[SDOI2013]森林——题解
    BZOJ1834:[ZJOI2010]网络扩容——题解
    BZOJ2668:[CQOI2012]交换棋子——题解
    BZOJ1070:[SCOI2007]修车——题解
    BZOJ1877:[SDOI2009]晨跑——题解
    在阿里,我们如何管理测试环境
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/7078518.html
Copyright © 2020-2023  润新知