菜鸟笔记
提升您的技术认知

Redis持久化机制

持久化机制

Redis 提供了两种持久化机制:RDB(快照持久化) 和 AOF(日志追加持久化),用于将内存中的数据持久化到磁盘,避免因进程退出或服务器宕机导致数据丢失。此外,Redis 4.0 引入了 混合持久化 模式,结合两者优势。以下是详细解析:

1、RDB(Redis Database)
核心原理
  • 全量快照:将某一时刻的内存数据完整写入磁盘,生成 .rdb 文件。
  • 触发方式
    1. 自动触发:根据 redis.conf 中的配置规则(如 save 900 1 表示 900 秒内至少 1 次写操作则触发)。
    2. 手动触发
      • SAVE:阻塞主线程,直到快照完成(生产环境慎用)。
      • BGSAVE:fork 子进程执行快照,主线程继续处理请求(推荐方式)。
  • 执行流程
    1. 主线程 fork 子进程,子进程负责写入快照(copy-on-write 机制,不影响主线程读写)。
    2. 子进程将内存数据序列化到临时文件。
    3. 替换旧的 .rdb 文件,完成持久化。
优缺点
优点 缺点
1. 文件体积小,恢复速度快(全量加载)。 1. 无法实时持久化,可能丢失最近写入的数据。
2. 适合备份(如定时同步到远程服务器)。 2. fork 子进程时可能占用大量内存和 CPU。
3. 跨版本兼容性好(不同 Redis 版本可读取)。 3. 大内存实例 fork 时可能导致短暂阻塞。
配置参数(redis.conf)
# 自动触发规则(可配置多个条件,用空格分隔)
save 900 1        # 900秒内至少1次写操作
save 300 10       # 300秒内至少10次写操作
save 60 10000     # 60秒内至少10000次写操作

stop-writes-on-bgsave-error yes  # 快照失败时禁止写入(避免数据不一致)
rdbcompression yes               # 是否压缩数据(牺牲CPU换取空间)
rdbchecksum yes                   # 写入时校验数据(增加文件生成时间)
dbfilename dump.rdb               # 快照文件名
dir ./                            # 快照存储目录(需提前创建,权限可写)
适用场景
  • 对数据完整性要求不高,允许丢失最近几分钟数据。
  • 需定期备份(如每天一次),用于灾难恢复。
  • 主从复制场景(主节点通过 RDB 同步数据到从节点)。
2、AOF(Append Only File)
核心原理
  • 增量日志:将每个写命令(如 SET/HSET 等)按协议格式追加到 AOF 文件末尾,读命令不记录
  • 重写机制(AOF Rewrite)
    • 随着时间推移,AOF 文件会变庞大(如多次 INCR 同一个键),通过 BGREWRITEAOF 命令优化:
      • 子进程重新构建键值对的最小命令集合(如用最终的 SET 替代多次 INCR)。
      • 生成新的 AOF 文件,替换旧文件(不阻塞主线程)。
  • 触发重写方式
    1. 自动触发:根据 auto-aof-rewrite-percentage(默认 100%,即文件大小较上次重写后增长 100%)和 auto-aof-rewrite-min-size(默认 64MB,文件最小体积)。
    2. 手动触发:BGREWRITEAOF
优缺点
优点 缺点
1. 数据安全性高(可配置每秒或实时刷盘)。 1. 文件体积通常大于 RDB(记录所有写命令)。
2. 支持实时持久化(根据 fsync 策略)。 2. 恢复速度较慢(需重放所有命令)。
3. 日志文件可读(便于排查问题)。 3. 重写时可能消耗大量 CPU 和 I/O。
配置参数(redis.conf)
appendonly yes         # 启用 AOF(默认关闭)
appendfilename "appendonly.aof"  # AOF 文件名
appendfsync always     # 刷盘策略:
                        # always:每个写命令都刷盘(最慢,数据安全性最高)
                        # everysec:每秒刷盘(推荐,兼顾性能与安全)
                        # no:由操作系统决定(最快,风险高)
no-appendfsync-on-rewrite yes  # 重写时是否停止刷盘(避免阻塞)
auto-aof-rewrite-percentage 100 # 触发重写的文件增长百分比
auto-aof-rewrite-min-size 64mb  # 触发重写的最小文件大小
aof-load-truncated yes   # 加载时忽略损坏的日志(避免启动失败)
aof-use-rdb-preamble yes # 混合持久化时,在 AOF 开头添加 RDB 内容
数据恢复流程
  1. 读取 AOF 文件,解析并执行所有写命令,重建内存数据。
  2. 若 AOF 文件损坏,可通过 redis-check-aof --fix 工具修复。
3、混合持久化(Hybrid Persistence)
核心原理
  • Redis 4.0+ 新增:在 AOF 重写时,先将当前内存数据以 RDB 格式写入 AOF 文件开头,再追加增量的写命令。
  • 优势
    • 结合 RDB 的快速恢复能力(加载时先读 RDB 部分)和 AOF 的增量日志(仅重放最近命令)。
    • 减少 AOF 文件体积,提升恢复效率。
配置方式
aof-use-rdb-preamble yes  # 开启混合持久化(默认开启)
4、两种持久化机制对比
维度 RDB AOF
数据安全 低(可能丢失最后一次快照后的数据) 高(取决于 fsync 策略)
文件体积 小(压缩后) 大(原始命令日志)
恢复速度 快(全量加载) 慢(重放所有命令)
性能影响 fork 时可能阻塞主线程 每秒刷盘几乎无阻塞,always 会降低写入性能
适用场景 备份、主从同步、允许少量数据丢失 金融交易、实时数据要求高的场景