config rewrite 不会自动保存配置到 redis.conf 的根本原因是:redis 仅在启动时读取配置文件,运行时 config set 修改的配置不会实时写回;config rewrite 仅将内存中被修改且支持持久化的白名单配置项重写入启动所用的 conf 文件,前提是 redis 确实通过该文件启动且进程有写权限。

CONFIG REWRITE 为什么没保存到 redis.conf 文件
根本原因:Redis 只在启动时读取 redis.conf,运行中通过 CONFIG SET 修改的配置项不会自动写回磁盘文件;CONFIG REWRITE 也不是“实时同步”,它只把当前内存中**被修改过且支持持久化的配置项**,按规则重写进原配置文件 —— 前提是 Redis 启动时确实用了这个文件(即通过 redis-server /path/to/redis.conf 启动),且进程有对应路径的写入权限。
常见错误现象:CONFIG REWRITE 返回 OK,但打开 redis.conf 发现内容没变,或只改了少数几行。
- Redis 是用
redis-server无参启动(即使用默认配置),此时没有关联的 conf 文件,CONFIG REWRITE会直接失败(报错(error) ERR The server is running without a config file) - 启动时用了 conf 路径,但 Redis 进程对那个目录没有写权限(比如 systemd 启动时用户是
redis,而 conf 在/etc/下属 root 所有) - 某些配置项不支持被
CONFIG REWRITE持久化(如maxmemory-policy可以,但replica-serve-stale-data在旧版本中可能被忽略)
哪些配置项能被 CONFIG REWRITE 保存
CONFIG REWRITE 不是全量 dump,它只写入「运行时可动态修改 + 明确对应 conf 中某配置项」的值。Redis 内部维护了一个白名单,例如:
- 支持:
requirepass、maxmemory、maxmemory-policy、timeout、tcp-keepalive、save(RDB 触发规则)、appendonly、appendfilename、appendfsync - 不支持(或行为受限):
bind、port、daemonize、pidfile、logfile—— 这些属于“启动即固定”类参数,修改后必须重启才生效,CONFIG REWRITE不会动它们 - 注意
save:如果运行中执行了CONFIG SET save ""关闭 RDB,CONFIG REWRITE会删掉 conf 中所有save行;反之,若新增save 60 1000,它会追加一行(不是覆盖)
CONFIG REWRITE 的正确执行流程
不能只靠一次 CONFIG REWRITE 就认为万事大吉。它本质是一次“生成式覆盖”,需配合人工校验和运维习惯。
- 先确认启动方式:
ps aux | grep redis看是否带 conf 路径;或连上后执行CONFIG GET dir和CONFIG GET dbfilename推断 conf 位置(通常dir是 conf 所在目录的父级) - 检查文件权限:
ls -l /etc/redis/redis.conf,确保 Redis 进程用户(如redis)对该文件有写权限(至少所在目录可写) - 执行前建议备份:
cp /etc/redis/redis.conf /etc/redis/redis.conf.bak.$(date +%s) - 执行后立刻验证:
CONFIG REWRITE返回 OK 后,用diff /etc/redis/redis.conf /etc/redis/redis.conf.bak.xxx看改了哪些行 - 特别注意
save和appendonly:这两个开关类配置一旦写错(比如多写了个引号),Redis 下次启动会直接报错退出
持久化配置修改后仍不生效的典型场景
即使 CONFIG REWRITE 成功写入文件,重启后配置“看起来没生效”,大概率是以下情况之一:
- Redis 实际加载的是另一个 conf:比如 systemd service 文件里写了
ExecStart=/usr/bin/redis-server /etc/redis/6379.conf,但你改的是/etc/redis/redis.conf - conf 中存在
include指令,而你要改的配置项定义在被 include 的子文件里(CONFIG REWRITE不会跨文件写入) - 修改了
appendonly yes并执行了CONFIG REWRITE,但 AOF 文件(appendfilename指定的)已存在且损坏,Redis 启动时载入失败,自动退回到 RDB 模式 —— 此时得手动redis-check-aof --fix - 使用容器部署时,conf 文件挂载为只读(
:ro),或挂载路径与进程内预期不一致(比如容器内路径是/usr/local/etc/redis.conf,但你改的是宿主机的/opt/redis.conf)
最易被忽略的一点:Redis 的配置加载顺序是“启动参数 > conf 文件 > include 文件 > 默认值”,哪怕 CONFIG REWRITE 把 conf 改对了,如果 systemd service 文件里硬编码了 --appendonly yes,那这个命令行参数永远优先于 conf 文件里的设置。











