标签:hz Redis server 源码 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初始化的流程图等,
标签:hz,Redis,server,源码,6.2,频率,刷新 来源: https://blog.csdn.net/weixin_43113679/article/details/119120716
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。