首页 > 代码库 > 服务器
服务器
发送命令请求:
(1)当客户端向服务器发送命令的时候,客户端首先会将命令请求转化哪位协议格式,然后发送给服务器
(2)server读取命令请求,进行解析,解析出argv和argc,并且将数据保存到输入缓冲区
(3)查找命令实现,查找命令对应的函数。
(4)执行预备操作
比如执行cmd指针指向的是否是nULL,检查argc参数个数是否匹配,是否进行了客户端验证,是否打开了maxmemory并且检查
(5)调用函数实现
(6)执行后续操作,比如写入AOF,传给其他服务器之类的
(7)将命令回复给客户端“”+OK\r\n“
(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)还原数据库状态
服务器