1 RDB (数据快照)

概念

RDB(Redis Data Backup file) = Redis 数据备份文件 = Redis 数据快照

把内存中的所有数据都记录到磁盘中。Redis 实例故障重启后,从磁盘读取快照文件恢复数据。

.rdb 文件默认保存在当前运行目录。

save 命令 和 bgsave 命令

  • save:由 Redis 主进程来执行 RDB,会阻塞所有命令
    完成后返回 “ok”
  • bgsave:开启子进程异步执行 RDB,避免主进程受到影响
    会立刻返回 “background saving started”

配置

Redis 会默认在服务停止时触发 RDB,但是也可以在 redis.conf 中配置,格式如下:

1
2
3
4
5
6
# 900 秒内如果至少有 1 个 key 被修改,就执行 bgsave
save 900 1
save 300 10
save 60 10000
# save "" 表示禁用 RDB
# save ""

其他常用配置:

1
2
3
4
5
6
7
8
# 是否压缩,建议不开启,因为也会消耗 CPU,而磁盘相对很不值钱
rdbcompression yes

# RDB 文件名称
dbfilename dump.rdb

# 文件保存的路径目录
dir ./

bgsave 底层实现细节

基本流程:

  1. fork 主进程得到一个子进程(这个过程会阻塞主进程),共享共享主进程的内存空间(这样速度快)
  2. 子进程读取内存数据,异步写入写入新的 RDB 文件
  3. 用新的 RDB 文件替换旧的 RDB 文件

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

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

image-20250604142530969

缺点

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

2 AOF (追加模式)

概念

AOF(Append Only File),追加文件

Redis 处理的每一个写命令都会记录在 AOF 文件,可以看作是命令日志文件

配置

开启

AOF 默认是关闭的,需要在 redis.conf 中配置开启:

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

配置 AOF 的命令记录频率

1
2
3
4
5
6
# 每执行一次写命令,立即记录到 AOF 文件(几乎不丢数据,性能影响大)
appendfsync always
# 写命令执行完先放入 AOF 缓冲区,然后每隔 1 秒讲缓冲区数据写到 AOF 文件(默认方案)
appendfsync everysec
# 写命令执行完先放入 AOF 缓冲区,由操作系统决定什么时候将缓冲区内容写回磁盘(性能最好,可能丢失大量数据)
appendfsync no

bgrewriteaof 命令

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

Redis 也会在触发阈值时自动重写 AOF 文件。阈值配置:

1
2
3
4
# AOF 文件比上次文件增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF 文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64mb

3 RDB vs AOF

image-20250604142547313