网站Logo 苏叶的belog

Redis持久化

wdadwa
1
2026-03-30

一,RDB

RDB 全称:Redis Database Backup file(Redis 数据备份文件),也被叫做 Redis 数据快照。简单来说就是把内存中的所有数据都记录到磁盘。当 Redis 实例故障重启后,从磁盘中读取快照文件,恢复数据。

快照文件叫 RDB 文件,默认保存在 Redis 当前运行目录。

两种保存方式:

  1. save:由 Redis 主进程来执行 RDB,会阻塞所有命令

    Redis 在关机时会自动执行一次 save 命令。

  2. bgSave:开启子进程执行 RDB,避免主进程受到影响


Redis 内部有触发 RDB 的机制,可以在redis.conf文件中找到,格式如下

# 900秒内,如果有至少1个key被修改,则执行bgsave,如果是save ""则表示禁用RDB
save 900 1
# 是否压缩,建议不开启,压缩会消耗cpu
rdbcompression yes
# RDB文件名称
dbfilename dump.rdb
# 文件保存路径目录
dir ./

二,RDB的fork原理

bgsave开始时会 fork 主进程得到子进程,子进程共享主进程的内容数据,完成 fork 后读取内存数据并写入 RDB 文件。

fork 采用的是copy-on-write技术:

  • 当主进程执行操作,访问共享内存
  • 当主进程执行操作,则会拷贝一份数据,执行写操作。

2953321-20240730203745987-1235922455.png

RDB 方式 bgsave 的基本流程

  • fork主进程得到一个子进程,共享内存空间
  • 子进程读取内存数据并写入新的RDB
  • 用新的RDB文件替换旧的RDB文件

RDB 的缺点:

  • RDB执行时间间隔长,两次RDB之间写入数据有丢失风险
  • fork子进程,压缩,写出RDB文件都比较耗时。

三,AOF

AOF 全称 Append Only File(追加文件)Redis 处理的每一个写命令都会记录在 AOF 文件,可以看做是命令日志文件。

2953321-20240730203746001-1696014114.png

AOF 默认是关闭的,需要修改 redis.conf 配置文件来开启 AOF

# 是否开启AOF功能,默认是no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"

AOF 的命令记录频率也可以通过redis.conf文件来配置

# 表示每执行一次命令,立即写入到AOF文件
appendfsync always
# 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写入AOF文件,是默认方案
appendfsync everysec
# 写命令执行完后先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写入磁盘
appendfsync no
配置项刷盘时机优点缺点
Always同步刷盘可靠性高,几乎不丢失数据性能影响大
everysec每秒刷盘性能适中最多丢失1秒数据
no操作系统控制性能最好可靠性较差,可能丢失大量数据

因为 AOF 是记录所有 set 命令,会导致 aof 文件远比 rdb 文件大,而且 AOF 会记录对同一个 key 的多次写操作,但只有最后一次写操作才有意义。通过bgrewriteaof命令,可以让 aof 文件执行重写功能,用最少的命令达到相同的效果。

2953321-20240730203745816-1587541016.png

Redis 也会在触发阈值时自动去重写 AOF 文件,阈值可以在redis.conf中配置

# AOF文件比上次文件增长超过多少百分比则重写
auto-aof-rewrite-percentage 100
# 触发aof rewrite的最小文件尺寸
auto-aof-rewrite-min-size 64mb

四,RDB和AOF对比

RDBAOF
持久化方式定时对整个内存做快照记录每一次执行set命令
数据完整性不完整,两次备份之间会丢失相对完整,取决于刷盘策略
文件大小会有压缩,文件体积小记录命令,文件体积大
宕机恢复速度很快
数据恢复优先级低,因为数据完整性不如AOF高,因为数据完整性更高
系统资源占用高,大量cpu和内存消耗低,主要是磁盘IO资源,但AOF重写时会占用大量cpu和内存资源
使用场景可以容忍数分钟的数据丢失,追求更快的启动速度对数据安全性要求较高的场景
动物装饰