首页 > 代码库 > 服务器

服务器

发送命令请求:

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

 

服务器