Redis 6.2&7 save配置的一个坑

skyyoung
发布于 2023-10-31 14:52
浏览
0收藏

一、问题

Redis臭名昭著的神坑配置save,可以自动完成持久化。

save 3600 1 300 100 60 10000

但对持久化了解的人也知道,它是性能杀手,所以一般情况下,我们在线上不会用这个功能的,具体两种方法:

  1. 不添加这个配置
  2. 显示配置save ""

在Redis 6.2以前,上述两种方法都可以实现。但如果你用Redis 6.2、Redis 7就会发现使用第一种方法的话,会默认加上这个配置:

127.0.0.1:6380> config get save
1) "save"
2) "3600 1 300 100 60 10000"

二、原因

before 6.2(6.0.15) server.c(加载配置文件前会清理掉save配置)

if (server.sentinel_mode && configfile && *configfile == '-') {
    serverLog(LL_WARNING,
        "Sentinel config from STDIN not allowed.");
    serverLog(LL_WARNING,
        "Sentinel needs config file on disk to save state.  Exiting...");
    exit(1);
}
resetServerSaveParams();
loadServerConfig(configfile,options);

After 6.2(例如7.0.11) server.c ,显然没有清理

....
loadServerConfig(server.configfile, config_from_stdin, options);
if (server.sentinel_mode) loadSentinelConfigFromQueue();

resetServerSaveParams()函数会置空默认配置

void resetServerSaveParams(void) {
    zfree(server.saveparams);
    server.saveparams = NULL;
    server.saveparamslen = 0;
}

默认配置中:

void initServerConfig(void) {
  ...........
    appendServerSaveParams(60*60,1);  /* save after 1 hour and 1 change */
    appendServerSaveParams(300,100);  /* save after 5 minutes and 100 changes */
    appendServerSaveParams(60,10000); /* save after 1 minute and 10000 changes */
}

三、 结论

1 .save配置一定要显示定义

save ""
  1. Redis 6.2 7后改动较大(换作者),要仔细阅读release log


文章转载自公众号:Redis开发运维实战

分类
标签
已于2023-10-31 14:52:15修改
收藏
回复
举报
回复
    相关推荐