Redis 的数据主要存储在内存里,读写速度很快,但内存数据天然怕宕机。持久化的作用就是把内存里的数据落到磁盘,Redis 重启后可以从磁盘恢复。

课件里把 Redis 持久化分成两类:RDBAOF

一、RDB:把某一刻的数据做成快照

RDB 全称是 Redis Database Backup file,也叫 Redis 数据快照。简单说,就是把 Redis 内存中的数据在某个时间点整体记录到磁盘。

Redis 内存数据

生成 RDB 快照文件

Redis 重启后加载 RDB

恢复数据

RDB 可以通过 savebgsave 触发。

命令 特点
save 主进程执行,会阻塞所有命令
bgsave fork 子进程执行,主进程继续处理请求

实际生产中更常用 bgsave

二、bgsave 和 Copy-on-Write

bgsave 执行时,Redis 主进程会 fork 出一个子进程。子进程共享主进程的内存数据,然后把这份数据写入 RDB 文件。

RDB 文件 子进程 Redis 主进程 RDB 文件 子进程 Redis 主进程 fork 子进程 读取共享内存 写入快照文件 继续处理客户端命令

这里涉及 Copy-on-Write,也就是写时复制:

  1. 主进程执行读操作时,仍然访问共享内存。
  2. 主进程执行写操作时,才会复制一份被修改的数据页。
  3. 子进程继续基于 fork 时刻的视图生成 RDB。

RDB 的优点是文件紧凑,恢复速度快;缺点是两次快照之间的数据可能丢失。

三、AOF:把每一条写命令追加到文件

AOF 全称 Append Only File,意思是追加文件。Redis 会把处理过的每一条写命令记录到 AOF 文件里,可以把它理解成命令日志。

客户端写命令

Redis 执行命令

追加到 AOF 文件

重启时重新执行命令恢复数据

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

appendonly yes
appendfilename "appendonly.aof"

AOF 的刷盘频率由 appendfsync 控制:

策略 含义 特点
always 每执行一次写命令就刷盘 最安全,性能最差
everysec 每秒刷盘一次 默认方案,性能和安全折中
no 由操作系统决定何时刷盘 性能最好,风险最大

生产中最常见的是 everysec

四、AOF 重写:让日志变小

AOF 记录的是命令,所以文件可能越来越大。比如同一个 key 被多次修改:

set num 123
set name jack
set num 666

真正有意义的其实只有最终状态:

mset name jack num 666

AOF 重写就是用更少的命令表达相同的数据状态。可以手动执行:

bgrewriteaof

也可以通过配置自动触发:

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

五、RDB 和 AOF 怎么选?

对比项 RDB AOF
文件内容 数据快照 写命令日志
文件体积 较小 通常较大
恢复速度 较快 相对较慢
数据安全 可能丢失最近一次快照后的数据 更安全,最多丢失 1 秒左右
性能影响 fork 和写快照时有影响 持续追加日志,有刷盘成本

如果只是缓存场景,数据可以从 MySQL 重新加载,RDB 通常够用。如果对数据安全性要求较高,实际开发中往往会 RDB 和 AOF 结合使用。

面试可以这样回答:

Redis 持久化主要有 RDB 和 AOF。RDB 是快照,恢复快、文件小,但可能丢失快照后的数据;AOF 是追加写命令,数据安全性更好,但文件更大,需要重写。生产中如果对数据安全要求较高,通常会两者结合,AOF 使用 everysec 做性能和安全的折中。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐