都知道定时删除策略,而且刷新的频率默认是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初始化的流程图等,