Redis 提供了两种持久化方式:RDB(Redis Database)和 AOF(Append Only File),它们各有优缺点,也可以同时使用。
RDB 持久化
工作原理: RDB 是在指定的时间间隔内生成数据集的时间点快照。Redis 会 fork 一个子进程,将内存中的数据写入到一个临时文件中,然后用这个临时文件替换旧的 RDB 文件。
优点:
- 文件紧凑:RDB 文件是压缩的二进制文件,体积小,适合备份和灾难恢复
- 恢复速度快:RDB 文件的恢复速度比 AOF 快,因为不需要重新执行命令
- 对性能影响小:RDB 是由子进程执行的,对主进程性能影响较小
- 适合冷备份:RDB 文件可以方便地传输到远程服务器进行备份
缺点:
- 数据丢失风险:如果 Redis 突然宕机,可能会丢失最后一次快照之后的所有数据
- fork 操作耗时:当数据量很大时,fork 子进程可能会阻塞主进程
- 实时性差:RDB 是基于时间间隔的,无法做到实时持久化
配置参数:
save <seconds> <changes>:设置保存条件,如save 900 1表示 900 秒内至少有 1 个 key 变化就保存rdbcompression yes:是否压缩 RDB 文件rdbchecksum yes:是否对 RDB 文件进行校验
AOF 持久化
工作原理: AOF 记录服务器接收到的每一个写操作命令,将这些命令追加到 AOF 文件的末尾。Redis 重启时,会重新执行 AOF 文件中的命令来恢复数据。
优点:
- 数据安全性高:AOF 可以配置为每秒同步或每次写操作同步,数据丢失风险低
- 可读性强:AOF 文件是文本格式,可以手动查看和修改
- 自动重写:AOF 文件过大时会自动重写,压缩文件体积
缺点:
- 文件体积大:AOF 文件通常比 RDB 文件大
- 恢复速度慢:需要重新执行所有命令,恢复速度比 RDB 慢
- 性能影响大:每次写操作都需要同步到磁盘,对性能影响较大
配置参数:
appendonly yes:开启 AOF 持久化appendfsync always/everysec/no:同步策略always:每次写操作都同步,最安全但性能最差everysec:每秒同步一次,推荐配置no:由操作系统决定何时同步,性能最好但安全性最差
auto-aof-rewrite-percentage 100:AOF 文件重写的增长百分比auto-aof-rewrite-min-size 64mb:AOF 文件重写的最小大小
RDB + AOF 混合持久化
Redis 4.0 之后支持混合持久化,开启后,AOF 重写时会将 RDB 的内容写入 AOF 文件开头,后续的增量命令继续以 AOF 格式追加。这样既保证了数据安全性,又提高了恢复速度。
配置:
aof-use-rdb-preamble yes:开启混合持久化
选择建议
- 如果对数据安全性要求不高:只使用 RDB,性能更好
- 如果对数据安全性要求很高:只使用 AOF,配置为
appendfsync everysec - 如果既要性能又要安全性:使用 RDB + AOF 混合持久化
- 如果数据量很大:建议使用 RDB,因为 AOF 的恢复速度太慢
在实际生产环境中,通常会同时开启 RDB 和 AOF,或者使用混合持久化,以兼顾性能和数据安全性。