都知道定时删除策略,而且刷新的频率默认是10,但是实际上redis的刷新频率实际生效的是几次呢?
看一下源码才是才能最能了解的,此版本是6.2版本
如果对定时删除策略源码感兴趣的可以看一下我另一篇博客Redis的过期删除策略源码分析(定时删除)
/* This is our timer interrupt, called server.hz times per second. * Here is where we do a number of things that need to be done asynchronously. * For instance: * 这是我们的定时器,每秒调用 server.hz 次。这里是我们做一些需要异步完成的事情的地方。例如 * - Active expired keys collection (it is also performed in a lazy way on * lookup).清理过期键集合(它也在查找时以惰性方式执行) * - Software watchdog. 软件监听器 * - Update some statistic.更新一些统计数据 * - Incremental rehashing of the DBs hash tables.DBs 哈希表的增量重新散列 * - Triggering BGSAVE / AOF rewrite, and handling of terminated children.触发 BGSAVE / AOF 重写,以及终止子进程的处理 * - Clients timeout of different kinds. 不同类型的客户端超时 * - Replication reconnection.复制重新连接 * - Many more... * * Everything directly called here will be called server.hz times per second, * so in order to throttle execution of things we want to do less frequently * a macro is used: run_with_period(milliseconds) { .... } *在这里直接调用的所有内容都将被每秒调用server.hz次,因此为了限制我们希望执行的操作的频率,我们使用了一个宏:run_with_period(毫秒),这里决定频率 */ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) { //………省略 //#define MAX_CLIENTS_PER_CLOCK_TICK 200 每次循环最多处理200个客户端连接, //#define CONFIG_MIN_HZ 1 最小刷新频率是1,但是一般是10,就像下面这样server.hz是从配置文件中读取的, //默认是10,通过这个也知道 server.hz在配置文件中配置的代表初始值,是否增加取决于客户端的连接数 //#define CONFIG_MAX_HZ 500 最大刷新频率是500 server.hz = server.config_hz; /* Adapt the server.hz value to the number of configured clients. If we have * many clients, we want to call serverCron() with an higher frequency. *根据配置的客户端数量调整 server.hz 值。如果我们有很多客户端,我们希望以更高的频率调用 serverCron() */ if (server.dynamic_hz) { while (listLength(server.clients) / server.hz > MAX_CLIENTS_PER_CLOCK_TICK) { server.hz *= 2; if (server.hz > CONFIG_MAX_HZ) { //这样就算listLength(server.clients)超过10万,刷新频率也就是500 server.hz = CONFIG_MAX_HZ; break; } } } /* Handle background operations on Redis databases. 处理Redis数据库的后台操作*/ databasesCron(); //....省略 } /* This function handles 'background' operations we are required to do * incrementally in Redis databases, such as active key expiring, resizing, * rehashing. *此函数处理我们在Redis数据库中增量执行的“后台”操作,例如活动密钥过期、调整大小、重新灰化。 */ void databasesCron(void) { /* Expire keys by random sampling. Not required for slaves * as master will synthesize DELs for us. *通过随机抽样使密钥过期。salve不需要,因为master会为我们合成DEL */ if (server.active_expire_enabled) { if (iAmMaster()) { //这里调用的就是定时删除的逻辑代码, activeExpireCycle(ACTIVE_EXPIRE_CYCLE_SLOW); } else { expireSlaveKeys(); } } }
看完上面的源码就知道了,配置文件中的刷新频率只是一个初始值,不是实际运行时的刷新频率,是动态改变的,低版本的可能没有这个,所以如果线上运行哪个版本就去看哪个版本的源码最好。
activeExpireCycle
这个方法可以看上面的链接,链接上有这个方法的源码
下面挂一张serverCron
这个方法整体的处理逻辑,可能版本不是6.2的,有一点区别,但是大体是一致的,
下面这张图来自Redis(二):单机数据库的实现 里面的源码讲解的挺好的,还有持久化的流程图,redis初始化的流程图等,