直接回答
Redis 有两种持久化机制:RDB 是定时生成内存数据的快照文件(紧凑二进制,恢复速度快,但两次快照之间的数据可能丢失);AOF 以追加方式记录每条写命令(丢数据少,取决于刷盘策略,但文件大、恢复慢)。生产环境通常两者同时开启:AOF 保证数据安全,RDB 用于快速重启恢复和冷备份。
展开解析
- RDB:通过 save/bgsave 触发,bgsave 用 fork 子进程 + 写时复制生成快照,期间父进程继续服务。适合备份、主从全量同步、灾难恢复;缺点是 fork 大内存实例有阻塞风险,且宕机丢失最近一个周期的数据。
- AOF:记录写命令,appendfsync 控制刷盘:always(每条都刷,最慢最安全)、everysec(默认,每秒刷,最多丢 1 秒)、no(交给 OS)。文件会膨胀,靠 AOF 重写(fork 子进程根据当前内存数据生成最小命令集)压缩。
Redis 4.0 引入混合持久化:AOF 重写时前半段用 RDB 格式、增量部分用命令追加,兼顾恢复速度和数据完整性,建议开启。
选择建议:只做缓存、可丢失 → 单 RDB 甚至不开;要求尽量零丢失 → AOF everysec + RDB 备份;都要 → 混合持久化。追问方向:fork 的 COW 为何可能内存翻倍、AOF 重写期间的新命令如何不丢(重写缓冲区)。