Redis 持久化机制详解:RDB、AOF 与混合模式
Redis 作为内存数据库,数据默认存储在内存中,若发生宕机可能导致数据丢失。持久化机制通过将内存数据写入磁盘,确保数据可恢复。Redis 提供两种核心持久化方式:RDB(快照) 和 AOF(Append Only File),4.0 版本后新增 混合模式,结合两者优势。本文基于 Redis 6.0.10 版本,详细解析这三种机制的原理、配置与优缺点。
RDB 持久化(Redis DataBase)
RDB 是 Redis 默认的持久化方式,通过定时生成内存数据的快照(二进制文件)实现持久化,恢复时通过加载快照文件还原数据。
核心原理
快照生成:在指定时间间隔内,当写入操作满足触发条件时,Redis 会 fork 一个子进程,将内存数据完整写入临时文件,完成后替换旧快照文件(dump.rdb)。
Copy On Write(COW):fork 后父子进程共享内存数据,父进程处理新请求时,若修改数据会复制对应内存页(不影响子进程的快照生成),避免数据不一致。
子进程在做数据持久化的过程中,只会进行遍历读取,但是父进程必须服务客户端请求,可能会对数据进行修改,此时使用COW(copy on write)机制,当父进程写数据时,将该内存页复制一份父进程来操作修改,其余的还是在共享内存内。随着父进程持续的修改数据,越来越多的共享页面被分离出来,内存会持续增长,但是最多也不会超过原有数据内存的2倍
每一页是4K
配置参数(redis.conf)
RDB 配置位于 SNAPSHOTTING 模块,核心参数如下:
| 参数 |
作用 |
默认值 |
save <seconds> <changes> |
触发快照的条件(多少秒内发生多少次修改),多条件为 “或” 关系。 |
save 900 1(15 分钟 1 次)、save 300 10(5 分钟 10 次)、save 60 10000(1 分钟 10000 次) |
stop-writes-on-bgsave-error |
若快照生成失败,是否停止写入操作(避免数据不一致)。 |
yes |
rdbcompression |
是否使用 LZF 算法压缩快照文件(节省空间,略增 CPU 开销)。 |
yes |
rdbchecksum |
是否对快照文件进行 CRC64 校验(确保完整性,略增性能损耗)。 |
yes |
dbfilename |
快照文件名称。 |
dump.rdb |
dir |
快照文件存储目录。 |
如 /usr/local/var/db/redis/ |
save 900 1 #15分钟内修改了1次
save 300 10 #5分钟内修改了10次
save 60 10000 #1分钟内修改了10000次
当达到条件时会触发bgsave命令
这个我测试了一下 save 300 3表示的是自上次生成rdb快照后,300s内如果有3次更改,在300s的时间节点时会触发一次bgsave命令,而不是写入3次后就立马触发
手动触发快照
save 命令:由主线程执行,会阻塞所有客户端请求(直到快照完成),生产环境慎用。
bgsave 命令:后台执行(background save),fork 子进程处理快照,主线程继续响应请求,不阻塞服务。