Redis 持久化
Redis 持久化:将内存数据写入持久存储(如磁盘)
四种策略
- 无持久性:禁用持久性。
- RDB(Redis DataBase)
- 以指定的时间间隔,记录内存中的数据集快照。
- 恢复时将快照文件直接读到内存里。
- AOF(Append Only File)
- 以追加日志文件的形式,记录服务器接收到的写操作。
- 服务器启动时读取日志文件,重建数据集。
- 当日志文件过大时,Redis 会在后台重写日志(Rewrite)。
- RDB + AOF
- 同一个 Redis 实例中,可结合 AOF 和 RDB 使用。
- Redis 重启时,使用 AOF 文件重建原始数据集。
RDB
RDB(Redis DataBase)
- 以指定的时间间隔,记录内存中的数据集快照。
- 恢复时将快照文件直接读到内存里。
- 持久化时,将数据写入到一个临时文件中(而不是直接写入
dump.rdb
) - 持久化完成后,将临时文件的内容覆盖到
dump.rdb
。
1.1、持久化流程
-
调用
bgsave
开始持久化。 -
判断是否已有子进程(正在持久化),有则直接返回,没有则开始持久化。
-
当前进程
fork
一个子进程,fork 完成后可响应其它命令。- 父进程 fork 的过程是阻塞的。
- 子进程的 I/O 不会阻塞父进程。
-
子进程持久化完成后生成 RDB 文件,通知父进程。
1.1.1、bgsave
用于持久化
- save:阻塞式,直接在主进程中持久化。
- bgsave:异步,在后台创建子进程进行持久化。
1.1.2、fork
执行 bgsave 时,Redis 不会在主进程进行持久化,而是 fork 创建一个子进程。
fork:复制当前进程,作为当前进程的子进程。
- 子进程由系统 exec 调用,引入写时复制技术以提高效率。
- 通常,父进程和子进程共用物理内存。
- 当进程空间的内容发生变化时,将父进程的内容复制给子进程。
1.1.3、相关配置
redis.conf
含义 | 说明 | |
---|---|---|
dbfilename | RDB 文件名称 | 默认 dump.rdb |
dir | RDB 保存位置 | 默认是 Redis 启动时命令行所在目录 |
stop-writes-on-bgsave-error | 持久化发生错误时关闭写操作 | 推荐 yes |
rdbcompression | 使用 LZF 算法压缩 RDB 文件 | 推荐 yes |
rdbchecksum | 检查数据的完整性和准确性 | 推荐 yes |
1.2、特点
优点
- 适用于大规模数据的恢复,且对数据完整性和一致性不敏感。
- 节省磁盘空间,恢复速度快。
缺点
- fork 会复制当前进程的所有数据,占用 2 倍内存。
- 虽然 fork 采用写时拷贝技术,但在海量数据下消耗性能。
- 服务器异常停止时,可能丢失最后一次快照后的修改。
AOF
AOF(Append Only File)
- 以追加日志文件的形式,记录服务器接收到的写操作。
- 服务器启动时读取日志文件,重建数据集。
- 当日志文件过大时会重写日志(Rewrite),压缩文件。
2.1、持久化流程
-
客户端请求的写操作,会被追加到 AOF 缓冲区。
-
AOF 缓冲区根据 AOF 持久化策略,将写操作同步到磁盘 AOF 文件中。
-
AOF 文件大小超过重写策略或手动重写时,重写压缩 AOF 文件容量。
-
Redis 服务器重启时,加载 AOF 文件中的写操作以恢复数据。
2.1.1、配置
redis.conf
含义 | 说明 | |
---|---|---|
appendonly | 开启 AOF | 默认 no |
appendfilename | 文件名称 | 默认 appendonly.aof |
appendfsync | 同步频率 | always:每个写操作 everysec:每秒 no:Redis 不主动同步,由操作系统进行同步 |
2.1.2、Rewrite
压缩 AOF 文件内容,仅保留可恢复数据的最小指令集。
2.2、特点
优点
- 备份机制更稳健,丢失数据概率更低。
- 日志文件存放写操作指令,具有可读性,可处理误操作。
缺点
- 相比 RDB 占用更多磁盘空间。
- 恢复备份速度慢。
- 若同步频率为 always 或 everysec,有一定性能压力。
- 若日志文件中存在 Bug(如人为修改),会导致无法恢复。
RDB or AOF ?
- 可以单独使用 RDB,不建议单独使用 AOF,建议结合使用。
- 若对数据的完整性和一致性要求不高,可单独使用 RDB。
- 若仅作为内存缓存,可不考虑持久化。