rdb存结果(定时快照),aof存过程(实时追加命令);rdb文件小、恢复快但可能丢数据,aof数据安全、丢失少但文件大、恢复慢。

Redis 本身没有持久化日志,只有配置错的 logfile 才会暴增
Redis 不产生 AOF 或 RDB 的“日志文件”用于滚动——AOF 是数据文件(appendonly.aof),RDB 是快照(dump.rdb),它们不是日志,也不该用 logrotate 切割。所谓“持久化日志太大”,99% 是你误启了 logfile 配置项,让 Redis 把运行时日志(如连接、慢查询、repl 状态)持续追加写入一个磁盘文件,而 Redis 完全不管理这个文件的生命周期。
典型错误配置:
logfile "/var/log/redis/redis-server.log" loglevel verbose
这种组合下,单日日志可达 GB 级,且永不轮转、不压缩、不删除。
禁用 logfile 改走 syslog 是最稳妥的做法
Redis 原生支持 syslog,配合 rsyslog 或 systemd-journald 就能天然获得轮转、压缩、按大小/时间归档、自动清理能力,无需自己写脚本或硬塞 logrotate。
- 在
redis.conf中注释或删除logfile行,确保它未设置(即日志默认输出到 stdout) - 启用 syslog:
syslog-enabled yes,可选配syslog-ident redis-server和syslog-facility local0 - 在
/etc/rsyslog.d/60-redis.conf添加规则,例如:
local0.* /var/log/redis/redis.log & stop
然后重启 rsyslog 和 Redis。后续所有日志都由 rsyslog 接管,你只需配置 /etc/logrotate.d/rsyslog 即可统一管理。
如果必须保留 logfile,logrotate 是唯一可行方案
Redis 进程不会响应 SIGUSR1,无法配合 logrotate 的“重命名+reopen”流程;所以不能用 copytruncate(会丢日志),也不能指望 Redis 自己 reopen 文件。唯一安全方式是:logrotate 移走旧文件 → 发信号让 Redis 重新打开日志文件 → Redis 会新建一个同名空文件继续写。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
但前提是 Redis 编译时启用了 --enable-systemd 或你手动给它发 SIGHUP(仅部分版本支持)。更通用的做法是:
- 在
/etc/logrotate.d/redis中配置:
/var/log/redis/redis-server.log {
daily
rotate 7
missingok
notifempty
create 0644 redis redis
sharedscripts
postrotate
# 尝试通知 Redis 重新打开日志;若失败,至少保证新日志可写
if [ -f /var/run/redis/redis-server.pid ]; then
kill -USR1 `cat /var/run/redis/redis-server.pid` 2>/dev/null || true
fi
endscript
}
注意:USR1 是否生效取决于 Redis 版本和编译选项,5.0+ 默认不响应;生产环境建议优先走 syslog 路径。
别把 AOF 当日志去切,那是数据文件
有人看到 appendonly.aof 文件越来越大,就想用 logrotate 切它——这是危险操作。AOF 是 Redis 正在读写的主数据文件,强制移动或清空会导致数据丢失或服务崩溃。
正确做法只有两个:
- 开启 AOF 重写:
bgrewriteaof命令或配置auto-aof-rewrite-percentage+auto-aof-rewrite-min-size,让 Redis 自动压缩冗余命令 - 定期检查
aof-current-size和aof-base-size(用INFO persistence查),确认重写是否真正触发
如果你发现 AOF 日益膨胀却从不重写,大概率是配置了 auto-aof-rewrite-percentage 0 或磁盘空间不足导致重写失败——这时看 redis.log(或 syslog)里的错误提示比切文件有用得多。










