《Redis设计与实现》笔记6
更新日期:
单机数据库实现——serverCron函数
上面已经介绍过serverCron函数是redis的时间事件默认的唯一个执行函数,每隔100毫秒执行一次。下面介绍此函数的主要作用:
更新服务器时间缓存
设计:由于redis中有很多地方需要获取系统当前时间为了减少系统调用次数,估redis在服务器状态中设置了unixtime和mstime两个属性来缓存当前时间。
serverCron函数默认以每100毫秒一次的频率更新unixtime和mstime,所以两个属性纪录的时间精度并不高。(redis对于时间相关的属性,精确度都不高,这也是提高性能的一种取舍^_^,但是对于键设置的过期时间和添加慢查询日志这种需要高精度时间的功能,服务器会再次执行系统调用,从而获得准确系统时间)
更新LRU时钟
- LRU:LRU全称是Least Recently Used,即最近最久未使用
- lru:纪录对象最后一次被访问的时间,每个redisObject中的属性。计算对象的空转时长方式:服务器的lruclock - 对象lru=对象空转时长。
- 当redis达到设置的maxmemcache时会对lru最早的进行回收.
- serverCron函数默认会以每10秒一次的频率更新lruclock属性值。lruclock同为服务器时间缓存的一种,所以这个时钟也不是实时的,从而计算出来的LRU时间也是模糊的。
更新服务器每秒执行命令次数
这个属性的值可以通过info status命令的instantaneous_ops_per_sec域查看
更新服务器内存峰值纪录
info status命令的stat_peak_memory域查看
处理SIGTERM信号
此信号的主要作用是会对服务器进行shutdown操作:sigterm信号在服务器中会关联一个sigtermHandler函数,此函数主要是在接收到sigterm信号时打开服务器的shutdown_asap标识。每次serverCron运行时会对shutdown_asap属性进行检查,并根据属性值对是否关闭服务器做出判断。
这里肯定会考虑突然shutdown服务器持久化动作还会做吗?不用担心,redis在关闭自身之前会进行RDB持久化操作,对于持久化动作也是在sigtermHandler函数拦截了sigterm信号时做的。
管理客户端资源
serverCron每次执行都会调用clientsCron函数,clientsCron函数会对一定数量客户端进行两个检查:
- 连接超时检查(连接超时客户端,释放)
- 输入缓冲区大小超过一定长度后,释放客户端当前的输入缓冲区,并重新创建一个默认大小的缓冲区
管理数据库资源
serverCron每次执行还会执行databasesCron函数,databasesCron函数对一部分数据库进行检查:
- 删除其中过期键,并在有需要时对字典进行收缩操作。