redisServer
2021-04-13 本文已影响0人
老杜振熙
命令执行过程
在服务端,跟服务器连接的所有客户端都对应一个redisClient
结构体;当服务器接收到某个客户端发来的命令请求时,先将字符串存到对应的redisClient
结构体的缓冲区中,然后调用分析器进行分析,提取出对于的argv
和argc
;然后根据argv[0]
到命令表中查找对应的执行函数,进行执行(命令表是一个字典,key就是命令名,比如SET
,value就是对应的redisCommand
结构体,保存了函数指针,所需参数个数,等信息),当然,执行之前还需要进行检查,比如权限是否匹配,输入参数是否有效等等。
执行完毕后,将执行结果保存在redisClient
的缓冲区中,随后向客户端所关联的socket发送信息即可。
serverCron函数
cron是时辰的意思,意味着这个函数需要定期执行,它的目的是管理服务器的资源,保证其良好运行。资源管理会涉及到很多方面的细节:
- 服务器状态的时间缓存会得到更新,这是一个不太精确的时刻;
- 服务器的LRU时钟
unsigned lruclock
会得到更新,该变量用于计算服务器中各个redis对象的空转时间(因为每个redis对象拥有一个变量,用于存储该对象最近一次访问对应的时间); - 服务器每秒钟的命令执行次数会得到更新;底层实现是:服务器会保存上一次执行
serverCron
函数时对应的时刻,以及自己已经执行的命令总次数;当本次执行cron时,作差求平均即可;服务器会默认保存16个这样的平均值,最后再求平均,即得到每秒钟命令执行次数; - 服务器的内存使用峰值会得到更新;
- 为SIGTERM信号重新分配响应函数,即先生成RDB,再终止程序;
- 保证持久化程序的正常运行;