这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战
Redis的时间事件
redis的时间事件分为定时时间和周期性事件,定时事件是让一段程序在指定时间之后执行一次,周期性事件是让一段程序每隔指定时间执行一次
一个时间事件由三个属性组成:
id:服务器为时间事件创建全局id,id号从小到大顺序递增
when:毫秒精度的时间戳,记录时间事件的到达时间
timeProc:时间事件处理器,当时间事件到达时,服务器会调用相应的处理器来处理事件。
一个时间事件是定时事件还是周期性事件取决于时间事件处理器的返回值:
如果是事件处理器返回AE_NOMORE,那么这个事件为定时事件:事件只到达一次,如果事件处理器返回非AE_NOMORE的整数值,那么这个事件为周期性时间:当时间事件到达后,服务器根据事件处理器返回的值,对时间事件的when属性进行更新,让这个事件在一段时间之后再次到达。
服务器将所有时间事件都放在了一个无序链表中,每当时间事件执行器运行时,它会遍历整个链表,查找所有已到达的时间事件,并调用相应的事件处理器。这个链表是按id倒序排列的,所谓无序链表指的是没有按照when属性来进行排序,所以当时间事件执行器运行的时候,它必须遍历链表中的所有时间事件,这样才能确保服务器中所有已到达的时间事件会被处理
serverCron函数
serverCron函数主要负责:
- 更新服务器的各类统计信息,比如时间、内存占用、数据库占用情况
- 清理数据库中的过期键值对
- 关闭和清理连接失效的客户端
- 尝试进行AOF或RDB持久化操作
- 如果服务器是主服务器,对con服务器进行定期同步
- 如果是集群模式,对集群进行定期同步和连接测试
默认情况下serverCron每秒运行10次,可通过修改hz选项调整每秒执行的次数。