【Redis八股|第7篇】Redis 持久化:RDB 和 AOF 区别详解 前言前面我们学习了 Redis 的数据类型、缓存问题、过期删除策略和内存淘汰策略。这一篇继续学习 Redis 面试中非常重要的一个知识点持久化机制。Redis 是内存数据库数据主要存储在内存中。那么问题来了如果 Redis 重启了内存数据是不是就没了Redis 怎么把内存中的数据保存下来RDB 和 AOF 有什么区别项目中应该怎么选择这就是 Redis 持久化要解决的问题。Redis 常见持久化方式主要有两种RDBAOF这一篇我们就把 RDB 和 AOF 的原理、优缺点、触发方式和面试回答完整梳理一遍。一、为什么 Redis 需要持久化Redis 数据主要在内存中。内存的特点是速度快但断电或进程退出后数据会丢失。比如 Redis 中保存了user:1 - 张三 product:1001 - 商品详情 article:1001:readCount - 100如果 Redis 进程重启内存清空这些数据就会消失。如果 Redis 只是做普通缓存数据丢了还可以从 MySQL 重新加载。但如果 Redis 中保存了比较重要的数据比如计数器、排行榜、分布式锁状态、部分业务临时数据就需要考虑恢复能力。持久化的作用就是把内存中的数据保存到磁盘Redis 重启后可以从磁盘恢复数据。二、Redis 持久化方式有哪些Redis 常见持久化方式有两种持久化方式全称核心思想RDBRedis Database定期生成数据快照AOFAppend Only File记录每次写命令简单理解RDB保存某一时刻的数据快照 AOF保存数据变化过程中的写命令比如 Redis 中有一个 keysetname zhangsansetage18RDB 可能保存的是最终数据name zhangsan age 18AOF 保存的是执行过的写命令setname zhangsansetage18Redis 重启时RDB 通过加载快照恢复数据AOF 通过重新执行写命令恢复数据三、RDB 是什么RDB 是 Redis 的快照持久化方式。它会在某个时间点把 Redis 内存中的数据保存成一个二进制文件。这个文件通常叫dump.rdb可以理解为给 Redis 数据拍了一张照片。比如当前 Redis 中有name - zhangsan age - 18 product:1001 - 商品详情RDB 会把这个时间点的数据整体保存到磁盘。Redis 重启时可以读取这个 RDB 文件把数据恢复到内存中。四、RDB 的触发方式RDB 有两种常见触发方式手动触发自动触发1. save 命令savesave会阻塞 Redis 主线程。也就是说在生成 RDB 文件期间Redis 不能处理其他请求。所以生产环境一般不推荐直接使用save。2. bgsave 命令bgsavebgsave会 fork 一个子进程由子进程负责生成 RDB 文件。主进程继续处理客户端请求。所以相比savebgsave更常用。3. 自动触发Redis 可以通过配置自动触发 RDB。比如save 900 1 save 300 10 save 60 10000含义是900 秒内至少 1 次修改触发 RDB 300 秒内至少 10 次修改触发 RDB 60 秒内至少 10000 次修改触发 RDB这些配置表示在一定时间内如果写操作达到指定次数就自动生成快照。五、RDB 的优点1. 文件紧凑RDB 保存的是某个时间点的数据快照是二进制文件通常比较紧凑。适合做备份。2. 恢复速度快Redis 重启时直接加载 RDB 文件恢复速度相对较快。3. 对运行性能影响较小使用bgsave时RDB 持久化由子进程完成主进程可以继续处理请求。4. 适合灾备RDB 文件可以定期备份到其他机器或对象存储中。比如每天凌晨备份一次 RDB用于灾难恢复。六、RDB 的缺点1. 可能丢失数据RDB 是定期快照不是每次写入都保存。比如 Redis 每 5 分钟生成一次 RDB。如果 Redis 在两次快照之间宕机那么最近几分钟的数据可能丢失。举例10:00 生成 RDB 10:01 写入数据 A 10:02 写入数据 B 10:03 Redis 宕机如果 10:03 之前没有新的 RDB那么 A 和 B 可能丢失。2. fork 子进程有开销bgsave需要 fork 子进程。如果 Redis 数据量很大fork 也会有一定开销。3. 快照频率不好控制快照太频繁会影响性能。快照太少数据丢失风险变大。所以 RDB 更适合对数据实时性要求没那么高的场景。七、AOF 是什么AOF 全称是Append Only File它的核心思想是Redis 每执行一条写命令就把这条命令追加到 AOF 文件中。比如执行setname zhangsan incr count del ageAOF 文件中会记录这些写命令。Redis 重启时会重新执行 AOF 文件中的命令从而恢复数据。可以理解为RDB 保存结果 AOF 保存过程八、AOF 如何开启Redis 配置文件中可以开启 AOFappendonly yesAOF 文件名通常是appendfilename appendonly.aof开启后Redis 会把写命令追加到 AOF 文件中。九、AOF 的同步策略AOF 写入磁盘有不同同步策略。常见配置appendfsync always appendfsync everysec appendfsync no1. always每次写命令都同步到磁盘。优点数据最安全缺点性能最差因为每次写入都要刷盘。2. everysec每秒同步一次。优点性能和安全性比较平衡缺点最多可能丢失 1 秒数据这是实际项目中最常见的配置。3. no由操作系统决定什么时候刷盘。优点性能最好缺点数据安全性最低Redis 不主动控制刷盘宕机时可能丢失更多数据。十、AOF 的优点1. 数据安全性更高相比 RDBAOF 可以记录更细粒度的写操作。如果使用everysec通常最多丢失 1 秒数据。2. 文件可读性更好AOF 记录的是 Redis 命令相对更容易理解。比如setname zhangsansetage18当然真实 AOF 文件格式不一定像手写命令这么直观但本质上是写命令日志。3. 恢复更完整因为 AOF 记录了写操作过程所以恢复时可以尽量还原最新状态。十一、AOF 的缺点1. 文件可能越来越大因为 AOF 是不断追加写命令。比如setcount1setcount2setcount3setcount4其实最终只需要setcount4但 AOF 会记录多条命令。如果不处理AOF 文件会越来越大。2. 恢复速度可能较慢Redis 重启时需要重新执行 AOF 中的命令。如果 AOF 文件很大恢复时间就会变长。3. 性能略低于 RDB因为 AOF 需要持续记录写命令所以对写性能有一定影响。十二、AOF 重写机制为了解决 AOF 文件越来越大的问题Redis 提供了 AOF 重写。AOF 重写不是简单地压缩旧文件而是根据当前内存数据重新生成一份更简洁的 AOF 文件。比如原来 AOF 中有setcount1setcount2setcount3setcount4重写后只需要setcount4再比如 List 操作rpush list A rpush list B rpush list C重写后可以变成更紧凑的形式。AOF 重写可以通过命令触发bgrewriteaofRedis 也可以根据配置自动触发重写。十三、RDB 和 AOF 同时开启时用哪个恢复如果 Redis 同时开启了 RDB 和 AOF一般优先使用 AOF 恢复数据。原因是AOF 通常比 RDB 数据更新更完整。RDB 是某个时间点的快照而 AOF 记录的是更连续的写命令。所以同时开启时Redis 更倾向于用 AOF 恢复。十四、RDB 和 AOF 对比对比点RDBAOF保存内容数据快照写命令日志文件大小通常较小通常较大恢复速度较快可能较慢数据安全可能丢失较多数据通常更安全性能影响较小持续写日志有一定影响适合场景备份、灾备更高数据安全要求文件形式dump.rdbappendonly.aof简单记忆RDB快照小而快但可能丢数据 AOF日志更安全但文件更大、恢复可能更慢十五、项目中应该怎么选如果 Redis 只是作为缓存数据丢失后可以从 MySQL 重建可以只开 RDB甚至根据情况不强依赖持久化如果 Redis 中有比较重要的数据比如计数器、排行榜、库存临时数据建议开启 AOF如果既想要恢复速度又想要数据安全RDB AOF 混合使用实际生产中常见做法是RDB 用于定期备份 AOF 用于尽量减少数据丢失不过最终还要看业务对数据丢失的容忍程度。十六、Redis 持久化和 MySQL 的关系有些同学会问Redis 开了持久化是不是就可以替代 MySQL答案仍然是不能。Redis 持久化只是增强 Redis 的数据恢复能力不代表它适合作为核心关系型数据库使用。MySQL 仍然更适合长期保存核心业务数据事务处理多表关联条件查询数据一致性要求高的场景Redis 更适合缓存高性能读写临时数据排行榜分布式锁计数器所以持久化不是为了让 Redis 替代 MySQL而是为了提升 Redis 自身的可靠性。十七、面试标准回答如果面试官问Redis 持久化方式有哪些RDB 和 AOF 有什么区别可以这样回答Redis 常见持久化方式有 RDB 和 AOF。RDB 是快照持久化会在某个时间点把 Redis 内存中的数据生成快照文件通常是dump.rdb。它的优点是文件紧凑、恢复速度快、适合备份缺点是可能丢失两次快照之间的数据。AOF 是追加日志持久化会把 Redis 执行过的写命令追加到 AOF 文件中。Redis 重启时通过重新执行这些命令恢复数据。AOF 的优点是数据安全性更高比如每秒刷盘最多丢失 1 秒数据缺点是文件通常更大恢复可能更慢对写性能也有一定影响。如果 RDB 和 AOF 同时开启Redis 通常优先使用 AOF 恢复因为 AOF 数据一般更新更完整。实际项目中可以根据数据安全要求选择也可以同时开启。十八、常见问题总结1. RDB 保存的是什么保存的是某一时刻 Redis 内存数据快照。2. AOF 保存的是什么保存的是 Redis 执行过的写命令。3. RDB 会不会丢数据可能会。因为 RDB 是定期快照两次快照之间的数据可能丢失。4. AOF 一定不丢数据吗不一定。如果配置everysec最多可能丢失 1 秒数据。如果配置always更安全但性能更差。5. RDB 和 AOF 同时开启时用哪个恢复通常优先使用 AOF。6. AOF 文件太大怎么办可以通过 AOF 重写机制生成更简洁的新 AOF 文件。十九、实际开发建议使用 Redis 持久化时可以注意下面几点缓存场景不一定强依赖持久化重要数据建议开启 AOFRDB 适合做定期备份AOF 推荐使用everysec策略AOF 文件会变大要关注重写机制Redis 持久化不能替代 MySQL生产环境要结合主从、哨兵、集群考虑高可用持久化文件要注意磁盘空间和备份策略二十、总结这一篇主要学习了 Redis 的两种持久化方式RDB 和 AOF。RDB 是快照持久化保存某一时刻的数据文件小恢复快适合备份但可能丢失两次快照之间的数据。AOF 是追加日志持久化保存写命令数据安全性更高但文件更大恢复可能更慢。实际项目中可以根据业务对数据安全和恢复速度的要求选择持久化方式。很多场景会同时使用 RDB 和 AOFRDB 用于备份AOF 用于减少数据丢失。下一篇我们继续学习 Redis 分布式锁原理与 Redisson 使用。