04-Redis 持久化机制:RDB、AOF 原理、优缺点与选型
Redis 持久化机制RDB、AOF 原理、优缺点与选型作者黒漂技术佬 | 系列Redis 缓存与高并发实战一、为什么要持久化Redis 的数据全在内存里。内存快是快但有个致命问题——一断电数据全没。服务器重启、机房跳闸、进程 crash你的缓存瞬间归零。你可能会说“缓存嘛丢了重新从 MySQL 加载不就行了” 这话只对了一半。如果你的 Redis 里存了计数器今天销量、Session用户登录状态、排行榜积分排名丢了就是丢了没法重新加载。这时候就需要持久化——把内存数据定期同步到硬盘上断电后能恢复。Redis 提供了两种持久化方式 一种混合方式。二、RDBRedis Database定时快照原理RDB 的核心思想是快照Snapshot每隔一段时间把内存里所有数据拍一张全量照片保存到硬盘上存成一个.rdb文件。它的实现很巧妙——不阻塞主线程1. Redis 主进程 fork 一个子进程 2. 主进程继续处理客户端请求 3. 子进程把当前内存数据写入硬盘dump 4. 写完后子进程退出替换旧的 RDB 文件fork 是什么Linux 系统中fork()会克隆一个完全相同的子进程。父子进程共享内存页写时复制 COW所以 fork 瞬间完成不阻塞。触发方式# 配置文件方式redis.confsave9001# 900秒内至少1个key变化触发快照save30010# 300秒内至少10个key变化save6010000# 60秒内至少10000个key变化# 手动触发SAVE# 阻塞主进程生产环境别用BGSAVE# 后台异步快照推荐优点文件小全量数据压缩存储一个.rdb文件可能就是几百 MB。恢复快直接把文件读到内存几秒钟搞定。性能好fork 子进程写文件主进程不受影响。缺点可能丢数据两次快照之间的数据变化不会被保存。比如配置了 5 分钟快照一次如果正好在第 4 分钟 59 秒宕机这近 5 分钟的数据全丢。fork 开销数据量大时 fork 可能耗时较长虽然概率低。三、AOFAppend Only File写命令日志原理AOF 的思路完全不同不拍快照而是把每一条写入命令都追加到一个日志文件里。恢复数据时把这些命令从头到尾重放一遍。客户端: SET name hello AOF 文件追加: *3\r\n$3\r\nSET\r\n$4\r\nname\r\n$5\r\nhello\r\n上例中的*3\r\n...是 Redis 的RESP 协议格式。不需要看懂知道它是Redis 内部通信用的格式就行。AOF 把所有写入命令原样记录恢复时逐条执行就像数据库的 binlog。三种刷盘策略# redis.confappendfsync always# 每条写命令都 fsync最安全最慢appendfsync everysec# 每秒刷一次推荐丢最多 1 秒数据appendfsync no# 交给操作系统决定可能丢几十秒不推荐策略数据安全性能适用场景always最高最低金融、支付QPS 低可用everysec中等中等99% 场景推荐no最低最高数据丢了无所谓的纯缓存AOF 重写RewriteAOF 文件会越来越大——INCR counter执行 1000 次文件里就有 1000 条命令。但实际上最终 counter 的值就是 1000前面 999 条都是冗余的。Redis 提供了AOF 重写后台 fork 子进程把当前内存数据用最少命令重新生成一份 AOF替换旧文件。# 自动重写触发条件redis.confauto-aof-rewrite-percentage100# AOF 文件增长 100% 时触发auto-aof-rewrite-min-size 64mb# AOF 文件至少 64MB 才触发# 手动触发BGREWRITEAOF优点数据丢失少everysec策略下最多丢 1 秒数据。可读性好AOF 是文本文件可以直接cat查看。缺点文件大同样的数据AOF 文件通常比 RDB 大不少。恢复慢重放命令比直接加载快照慢很多。四、混合持久化Redis 4.0Redis 4.0 提供了一个两全其美的方案——混合持久化RDB 快照全量 AOF 增量日志快照之后的变化 ↑ ↑ 文件前半部分 文件后半部分恢复时先用 RDB 部分快速加载全量数据再重放后面那点 AOF 增量。兼具 RDB 的恢复速度和 AOF 低数据丢失的特性。# redis.conf 开启混合持久化aof-use-rdb-preambleyes五、生产环境选型建议场景推荐方案纯缓存丢了无所谓只用 RDB或干脆不持久化计数器/排行榜丢少量可接受RDB AOF everysec混合持久化Session/分布式锁不能丢AOF everysec混合持久化消息队列/工控数据可靠性高要求AOF always如果 QPS 不高无人售货柜场景选型售货柜系统里缓存数据分为两类商品库存丢了可以从 MySQL 恢复 → 用 RDB5 分钟快照丢几分钟库存可接受。设备在线状态/心跳丢了不可恢复 → 用 AOF everysec 混合持久化保证设备状态不丢。一个 Redis 实例可以同时开启 RDB 和 AOFRedis 启动时会优先用 AOF 文件恢复因为更完整。终极建议生产环境同时开启 RDB AOF混合模式除非数据真的完全无关紧要。持久化是 Redis 可靠性体系的基石。理解 RDB 和 AOF 的区别根据你的业务数据重要程度做选型而不是盲目开、盲目关。