持久化

Redis 数据在内存中,重启会丢失。持久化把数据落盘,用于重启恢复与灾难备份。Redis 提供 RDBAOF 两种方式,可单独或组合使用。

RDB:快照

RDB 把某一时刻的全量数据二进制快照写入磁盘(dump.rdb)。

# 触发条件:900 秒内至少 1 个键变化 / 300 秒内 10 个 / 60 秒内 10000 个
save 900 1
save 300 10
save 60 10000

dbfilename dump.rdb
dir /var/lib/redis
BGSAVE    # 后台异步生成快照(fork 子进程),推荐
SAVE      # 前台阻塞生成,生产禁用
优点缺点
文件紧凑、恢复快两次快照间的数据可能丢失
对性能影响小(BGSAVE fork)fork 大实例时有内存与延迟抖动

AOF:追加日志

AOF 以文本协议记录每条写命令,重启时重放恢复。

appendonly yes
appendfilename "appendonly.aof"

# 刷盘策略
appendfsync everysec   # 每秒刷盘(默认,平衡)
# appendfsync always   # 每条命令刷盘(最安全,最慢)
# appendfsync no       # 交给操作系统(最快,最不可靠)

# 自动重写:文件增长超过 100% 且大于 64MB 时重写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

AOF 重写(rewrite):随着时间推移 AOF 会膨胀,Redis 通过重写生成「等价但最小」的命令集。

BGREWRITEAOF
优点缺点
丢失窗口小(everysec 最多丢 1 秒)文件体积大、恢复慢
命令可读、可审计重写有 fork 开销

混合持久化(推荐)

Redis 4.0+ 支持「RDB + AOF」混合:AOF 重写时以 RDB 格式保存基础快照,后续增量用 AOF 追加,兼顾恢复速度低丢失

aof-use-rdb-preamble yes

选择建议

场景建议
纯缓存,可容忍丢失关闭持久化,或仅用 RDB
缓存 + 部分数据重要RDB + AOF everysec(混合)
近乎不丢数据AOF always(性能代价大)
Warning

持久化不能替代备份与复制。RDB/AOF 文件损坏、误删、磁盘故障都会导致数据丢失。生产应结合:主从复制 + 定期备份 + 异地容灾,并实际演练恢复流程

fork 与内存

BGSAVEBGREWRITEAOF 都依赖 fork。Linux 的写时复制(COW)意味着 fork 后若写操作频繁,内存占用可能接近翻倍。

INFO persistence      # rdb_last_bgsave_status / aof_last_bgrewrite_status
INFO memory           # used_memory、mem_fragmentation_ratio
Tip

单实例内存建议不超过物理内存的一半,给 fork 的 COW 留足空间。若实例很大,可考虑降低 save 频率、使用 aof-use-rdb-preamble,或拆分多个实例。

小结

  • RDB 是紧凑快照、恢复快;AOF 记录写命令、丢失窗口小。
  • 生产推荐 混合持久化aof-use-rdb-preamble yes + appendfsync everysec)。
  • 持久化不等于备份,须配合复制与定期备份。
  • 关注 fork 带来的内存翻倍风险。