redis之服务器

7340阅读 0评论2019-09-09 stolennnxb
分类:NOSQL

redis服务器中的serverCron函数默认每100毫秒执行一次,这个函数负责管理服务器的资源,并保持服务器自身的良好运转
1. 更新服务器时间缓存
为了减少系统调用获取当前时间,服务器状态中的unixtime属性和mstime属性被用作当前时间的缓存。只有在使用高精度时间的功能时,才会再次执行系统调用获取当前时间
2. 更新LRU时钟(10s)
服务器状态中的lruclock属性保存了服务器的lru时钟,这个属性也是服务器时间缓存的一种。每个redis对象都会有一个lru属性,这个lru属性保存了对象最后一次被命令访问的事件,当服务器需要计算一个数据库键的空转时间,程序会用服务器的lruclock属性记录的时间减去对象的lru属性记录的事件,得出结果即为对象的空转时间
3. 更新服务器每秒执行命令次数
serverCron函数中的trackOperationsPerSecond函数会以每100ms一次的频率执行,这个函数的功能时以抽样计算的方式,估算并记录服务器在最近一秒钟处理的命令请求数量,这个值可以通过INFO status命令的instantaneous_ops_per_sec域查看
4. 更新服务器内存峰值记录
服务器状态中的stat_peak_memory记录了服务器的内存峰值大小
5. 处理SIGTERM信号
SIGTERM信号的处理器函数,是打开服务器状态的shutdown_asap标识,每次serverCron函数运行时,程序都会对服务器状态的shutdown_asap属性进行检查,并根据属性的值决定是否关闭服务器
6. 管理客户端资源
调用clientsCron函数,检查客户端与服务器之间的连接超时与否和释放缓冲区大小->重新分配
7. 管理数据库资源
调用databasesCron函数,对服务器中的数据库进行删除过期键,收缩字典等操作
8. 执行被延迟的BGREWRITEAOF
服务器的aof_rewrite_scheduled标识记录了服务器是否延迟了BGREWRITEAOF命令,
9. 检查持久化操作的运行状态
服务器状态使用rdb_child_pid属性和aof_child_pid属性记录执行BGSAVE命令和BGREWRITEAOF命令的子进程的ID,
这两个属性也可以用来检查两个命令是否正在执行,只要其中一个不是-1,程序就会执行一次wait3函数,如果有信号到达,那么表示有后台命令执行完成,需要执行响应的后续操作;如果没有信号到达,不做动作。如果两个属性均为-1:先查看是否有BGREWRITEAOF被延迟;再查看服务器的自动保存条件是否已经被满足;之后是检查服务器设置的aof重写条件是否满足。
10. 将aof缓冲区中的内容写入aof文件
11. 关闭异步客户端(缓冲区大小超出限制的客户端)
12. 增加cronloops计数器的值

服务器的初始化可以大致分为以下几个步骤
1. 初始化服务器状态结构,由initServerConfig函数完成
2. 载入配置选项, initServerConfig函数
3. 初始化服务器数据结构,initServer函数
4. 还原数据库状态
5. 执行事件循环
上一篇:redis客户端
下一篇:redis当中的复制