专栏Redis 修行录个人主页手握风云目录一、AOF 日志持久化1.1. 基础配置1.2. 命令写入机制1.3. 磁盘同步策略1.4. AOF 重写机制二、Redis 启动时数据恢复规则三、混合持久化一、AOF 日志持久化AOF 全称 Append Only File它并不会存储完整数据只会逐条记录每一条修改数据的操作指令所有写入、变更类操作都会持续追加写入日志文件的末尾服务重启恢复数据时程序会逐条重放文件里记录的全部操作指令一步步复现完整的数据变更流程最终还原出停机前内存里的全部数据。1.1. 基础配置cd /etc/ vim redis.conf sudo systemctl start redisappendfilename 指定的文件存储路径同 rdb 的文件路径。AOF 的完整工作流程客户端所有写入命令会先追加写入 AOF 缓冲区缓冲区再按照配置的 appendfsync 同步策略执行磁盘同步操作将数据落地硬盘随着持续写入操作不断累积AOF 文件体积会持续增大Redis 支持通过手动执行 bgrewriteaof 命令或依靠配置参数自动触发 AOF 重写机制定期对文件进行压缩清理过期数据、删除无效操作命令并合并多条同类写入指令减小文件占用空间当 Redis 服务器重启时程序会读取 AOF 文件并依次重放文件内记录的全部写命令以此完成内存数据的恢复。1.2. 命令写入机制AOF 的存储格式采用 Redis 标准文本协议可读性、兼容性好实现简单。flushall set key1 val1 set key2 val2 set key3 val3cd /var/lib/redis vim appendonly.aofaof_buf 缓冲区作用Redis 单线程模型若每条写命令直接同步硬盘会产生大量 IO 拖垮性能所有写入命令先存入内存缓冲区 aof_buf再按策略批量刷盘大幅减少磁盘 IO 次数。1.3. 磁盘同步策略由 appendfsync 参数控制缓冲区落盘逻辑区分 write写入系统页缓存与 fsync强制刷物理磁盘配置值执行逻辑优缺点 适用场景always命令写入 aof_buf 后立即调用 fsync 强制落盘完成再响应客户端数据零丢失性能极差仅支持几百 TPS仅极高安全场景使用everysec默认推荐先执行 write 写入系统缓存独立同步线程每秒执行一次 fsync兼顾性能与安全理论最多丢失 1 秒数据线上通用方案no仅执行 write由操作系统自主控制 fsync 刷盘时机性能最优宕机可能丢失大量数据数据不重要场景才使用1.4. AOF 重写机制AOF 文件随写入持续增大重写会基于当前内存数据生成精简新日志文件压缩磁盘占用、加快重启恢复速度。重写之后文件能够缩小主要存在四方面的优化原因已过期失效的键不会再被写入文件del、hdel、srem这类删除类无效命令会被全部剔除仅保留数据的最终状态多条同类写入命令会被合并为单条指令比如多次 lpush 操作可以整合为单条批量 lpush操作流程里的中间冗余内容会被丢弃最终只留存生效的数据指令。AOF 重写存在两种触发方式第一种为手动触发通过执行 bgrewriteaof 命令就可以直接发起 AOF 重写。第二种是自动触发由两个参数共同完成条件判断auto-aof-rewrite-min-size 是触发重写的AOF 最小文件大小默认数值为 64MBauto-aof-rewrite-percentage 用来判定当前AOF文件相较于上次重写文件的增长比例满足对应条件时就会自动执行AOF重写操作。接收重写请求若正在执行重写则直接放弃若存在 bgsave等待 RDB 完成再执行父进程执行fork创建子进程fork 阶段短暂阻塞主线程fork 完成后父进程继续正常处理客户端命令写操作正常存入aof_buf并按同步策略刷旧 AOF父进程新增写入操作额外存入专属aof_rewrite_buf重写缓冲区记录 fork 后新增数据子进程读取 fork 瞬间内存快照生成精简新 AOF 临时文件子进程完成后通知父进程父进程将重写缓冲区临时增量命令追加至新 AOF原子替换旧 AOF 文件完成重写。二、Redis 启动时数据恢复规则Redis 开机持久化加载优先级优先加载 AOF 文件无 AOF 文件才加载 RDB 快照。开启 AOF 且存在完整 AOF 文件 → 加载 AOF 恢复数据无 AOF 文件、存在 RDB 文件 → 加载 RDB 恢复AOF/RDB 文件损坏无法解析 → Redis 启动失败。三、混合持久化set key 111 set key 222 set key 333 bgrewriteaof如果我们手动执行了 bgrewriteaof 命令之后再次查看 appendonly.aof 文件之后会发现里面出现了二进制的内容这是因为 redis 默认开启了 AOF 和 RDB 的混合持久化这里也可以在配置文件里面进行修改。redis 持久化按照 AOF 的方式把每一个请求/操作都记录入文件。在触发 AOF 重写之后就会把当前内存的状态按照 RDB 的二进制格式写入到新的 AOF 文件中。后续再进行的操作仍然是按照 AOF 文本的方式追加到文件后面。