RDB持久化
Redis Database Backup File(Redis数据备份文件)简称 Redis 数据快照
Redis 将内存中数据记录到磁盘
Redis 故障重启后从磁盘读取 RDB file 恢复数据
save #主进程执行 RDB 阻塞所有命令
bgsave #子进程执行 RDB
注:关于bgsave 开始时将主进程中页表 fork(拷贝) 到子进程 实现子进程共享主进程的内存数据(页表存放虚拟内存与物理内存映射关系 主进程只能操作虚拟内存)
fork 基于 copy-on-write 技术
- 主进程进行读操作,访问共享内存(例如:数据A)
- 主进程进行写操作(例如 数据B),拷贝一份数据(数据B'),进行写操作,相应的对于数据B的读也指向了(数据B')
Redis 默认服务停止前将执行一次 RDB
RDB 的缺点
- 间隔时间长,两次 RDB 之间写入数据有丢失的风险
- fork 子进程、压缩、写出 RDB 文件都比较耗时间
AOF持久化
Append Only File(追加文件)
Redis 处理的命令均记录在 AOF文件(等同于命令日志文件)
Redis 中 AOF 默认关闭
AOF 命令记录默认频率 appendfsync everysec
注:其中 always 可靠性高但性能过差, no 性能最高但可靠性较差, everysec为折中选择
AOF文件相较于 RDB文件更大
通过 bgrewriteaof 命令让 AOF文件执行重写功能 以简化同一key多次写操作
Redis 在 AOF文件超过阈值时会自动去重写 AOF文件
- auto-aof-rewrite-percentage 100 (相比上次文件增长超过多少百分比触发)
- auto-aof-rewrite-min-size 64mb (文件体积大于阈值触发)
AOF 与 RDB 对比
RDB | AOF | |
持久化方式 | 定时对整个内存进行快照 | 记录执行的命令 |
数据完整性 | 不完整(两次备份间数据丢失) | 相对完整(取决于appendfsync) |
文件大小 | 文件体积小(可压缩) | 文件体积大 |
宕机恢复速度 | 快 | 慢 |
数据恢复优先级 | 低(数据完整性弱于AOF) | 高(数据完整性高) |
系统资源占用 | 高(CPU与内存大量占用) | 低(主要是磁盘IO资源) |
注:AOF重写时也将占用大量CPU与内存资源