dir 是 Redis 启动阶段加载的只读参数,使用 CONFIG SET 无法真正修改;dbfilename 可以在运行时调整,但不会永久保存;两者必须配合配置,同时保证目录路径和权限设置正确,Redis 才能正常生成持久化文件。

dir 是启动时只读参数,执行 CONFIG SET 也不会生效
在 Redis 配置中,dir 参数决定的是 RDB 和 AOF 文件保存的根目录位置。但这个参数有一个非常重要的特点:它通常不支持在 Redis 运行过程中动态修改。也就是说,当执行 CONFIG SET dir /new/path 时,Redis 一般会直接返回 ERR Unsupported CONFIG parameter: dir。这里需要明确,这个报错通常不是因为权限不足,也不是路径填写错误,而是因为 Redis 的内部设计决定了该参数会在服务启动时完成读取,并在启动后保持锁定状态。
在极少数情况下(例如 redis.conf 中根本没有显式写入 dir 配置项),CONFIG SET dir 可能看起来执行成功,但实际效果并不稳定,也不建议用于生产环境:
- 原有的 RDB 或 AOF 文件不会自动迁移到新目录
- Redis 重启后仍会按照原始配置加载,新设置通常会失效
CONFIG REWRITE虽然可能把配置写回 conf 文件,但在 systemd 或容器部署环境下,重写后的内容往往不会被真正采用
dbfilename 控制 RDB 文件名,CONFIG SET 可修改但不会持久保存
dbfilename 参数控制的是 RDB 快照文件的具体文件名,默认值通常是 dump.rdb。不过要注意,它本身只表示文件名,不是完整路径;必须与 dir 参数组合使用,才能确定 Redis 持久化文件的最终保存位置。这个参数支持在运行时通过命令直接修改,例如:CONFIG SET dbfilename mydb.rdb。设置成功后会立即在当前进程中生效,等到下一次执行 SA VE,或者自动触发 BGSA VE 时,Redis 就会尝试把快照写入 dir 目录下的 mydb.rdb 文件中。
不过还要特别注意以下几点:
- Redis 服务重启后,仍然会重新读取 redis.conf 中原本配置的
dbfilename值 - 如果
dir目录权限设置不正确(例如 Redis 运行用户没有写权限),即使dbfilename修改成功,SA VE依然可能失败,日志中通常只会显示Failed to open the temp RDB file - 不要以为修改
dbfilename就能绕过dir的目录权限检查——目录不可写时,文件名改得再正确也没有意义
如何确认配置是否真的生效?不要只看 CONFIG GET
很多用户执行 CONFIG GET dir 和 CONFIG GET dbfilename 后看到返回的是新值,就误以为 Redis 配置已经成功生效。实际上,这通常只能说明内存中的当前参数值发生了变化,并不能直接证明磁盘文件已经按预期写入。
更可靠的验证方法建议按以下三步进行:
- 先手动拼接完整路径:
CONFIG GET dir+CONFIG GET dbfilename,例如得到/var/lib/redis+mydb.rdb - 再执行
SA VE(阻塞式,更适合手动测试)或BGSA VE - 最后使用
ls -l /var/lib/redis/mydb.rdb检查文件是否存在、修改时间是否更新、文件属主是否为 redis 用户
如果目标文件没有出现,或者仍然写到了旧目录,就说明问题大概率出在以下几个方面:dir 配置没有正确生效、目录权限没有设置好,或者你修改的根本不是 Redis 实际加载的那个 redis.conf 文件。比如在 systemd 管理的服务中,常见的启动方式会显式指定 --config /etc/redis/6379.conf,而不是使用默认配置路径。
dir 和 dbfilename 的作用分工不能混淆
dir 必须是**绝对路径**,不能写成 ./data 或 data;而 dbfilename 只能是纯文件名,不能包含目录路径。这是 Redis 配置中的硬性规则,一旦颠倒使用或混合填写,就很容易引发异常行为:
- 如果把完整路径写进
dbfilename(例如dbfilename /tmp/dump.rdb),通常不会达到预期效果,Redis 仍会按照dir+dbfilename的方式拼接最终文件路径 - 如果
dir指向一个不存在或不可用的父目录(例如配置成/ssd/redis-data,但/ssd分区实际上未挂载),Redis 启动时可能失败,并报出类似Could not create server TCP listening socket的错误,甚至直接退出 - AOF 文件名由
appendfilename参数单独控制,它与dbfilename是两个不同的配置项,不能误认为修改一个就能同时影响两种持久化文件
还有一个最容易被忽视的关键点:修改 dir 后,必须确保 Redis 运行用户对目标目录拥有 w 和 x 权限。很多人创建目录后只执行了 chown redis:redis,但这还不够,通常还需要合适的权限设置,例如 chmod 755,这样 Redis 才能进入目录并成功写入文件。否则,即使参数本身配置正确,Redis 持久化依然无法正常工作。
