Redis 6.2定时删除刷新频率源码

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

Redis 6.2定时删除刷新频率源码

上一篇:mysql联表查询时on 后面添加 and条件


下一篇:HZ游记