说说redis如何持久化(要说具体过程)?

1 个回答

  • 菜菜
    世界上有两个我,一个想去远方,一个身不由己。
    Redis 提供两种主要的持久化机制:**RDB(快照)** 和 **AOF(追加文件)**,以及混合持久化。下面分开讲它们的原理和过程。 ### 1. **RDB 持久化(快照)** RDB 通过将 Redis 内存中的数据以**快照**的方式写入一个 `.rdb` 文件,适合做定时全量备份。 **具体过程** 1. 触发方式 * 手动命令:`SAVE`(阻塞) 或 `BGSAVE`(后台异步) * 自动触发:配置文件中 `save m n`(m 秒内有 n 次写操作) 2. 执行过程 * **SAVE**:主进程直接执行持久化,会阻塞所有客户端请求。 * **BGSAVE**:主进程 `fork()` 出一个子进程,子进程将当前内存数据写入临时 RDB 文件,写完后替换原文件,主进程继续提供服务。 3. 文件存储 * 默认路径:`dir` 配置项目录 * 默认文件名:`dump.rdb` 4. 特点 * 优点:文件体积小,恢复速度快,适合做全量备份。 * 缺点:可能丢失最后一次快照之后的修改(非实时)。 ### 2. **AOF 持久化(Append Only File)** AOF 记录所有写操作命令(不记录读命令),Redis 重启时按顺序执行这些命令来恢复数据。 **具体过程** 1. 开启方式 * 配置文件:`appendonly yes` * 文件名:`appendfilename "appendonly.aof"` 2. 写入过程 * 当写命令到来时,主进程将命令追加到 AOF 缓冲区。 * 根据 `appendfsync` 策略,将数据刷到磁盘: * `always`:每个命令都刷盘(最安全,最慢) * `everysec`(默认):每秒刷一次盘(性能和安全折中) * `no`:由操作系统自行刷盘(最快,不安全) 3. 重写过程(AOF 重写优化) * 随着时间推移,AOF 文件会越来越大。 * `BGREWRITEAOF` 会 fork 出子进程,子进程根据当前内存数据生成一份最简化的 AOF 文件(合并多次对同一 key 的写操作),替换原文件。 4. 特点 * 优点:数据更安全(丢失数据时间短)。 * 缺点:文件比 RDB 大,恢复速度慢。 ### 3. **混合持久化** Redis 4.0 引入,结合了 RDB 和 AOF 的优点。 * 重写时先生成一份 RDB 快照,然后记录之后的写命令到 AOF。 * 这样恢复时先加载 RDB,再执行少量 AOF 命令,速度快且数据安全性高。 ### 4. **Redis 持久化恢复过程** 1. Redis 启动时会先检查: * 如果同时存在 **AOF** 和 **RDB** 文件,优先加载 AOF(更完整)。 * 否则加载 RDB 文件。 2. 加载完成后开始接收客户端请求。
    发布于 2025-08-13 10:45 •IP属地 黑龙江
    举报
    评论
    收藏