Redis 持久化 RDB

RDB(Redis Database)是 Redis 的默认持久化方式:把某一时刻的"全量数据快照"压缩写入一个 .rdb 二进制文件,进程重启或机器故障后启动时加载它还原数据。它适合定时快照备份与数据迁移,也是主从全量同步的数据来源;代价是两次快照之间的写入可能丢失。

手动触发:SAVE 与 BGSAVE

SAVE 在主线程同步生成快照,期间阻塞所有请求,只适合停机维护;BGSAVE 用 fork 出来的子进程在后台生成,主进程继续服务,日常手动备份用 BGSAVE:

BGSAVE
# 输出:Background saving started
LASTSAVE
# 输出:(integer) 1730000000   # 最近一次成功保存的 Unix 时间戳
INFO persistence
# 输出:… rdb_bgsave_in_progress:0  rdb_last_bgsave_status:ok …

自动触发:save 配置

redis.conf 里用 save <秒数> <改动次数> 定义条件:在 <秒数> 内发生至少 <改动次数> 次写操作就自动 BGSAVE。7.x 默认是 3600 1、300 100、60 10000(更早版本为 900 1、300 10、60 10000):

# redis.conf
save 3600 1        # 3600 秒内至少 1 次写入
save 300 100       # 300 秒内至少 100 次写入
save 60 10000      # 60 秒内至少 10000 次写入
dbfilename dump.rdb
dir /var/lib/redis

设 save "" 可关闭自动快照。查看当前配置:

CONFIG GET dbfilename
# 输出:1) "dbfilename" 2) "dump.rdb"
CONFIG GET dir
# 输出:1) "dir" 2) "/var/lib/redis"

RDB 触发时机全集

  • 手动执行 SAVE / BGSAVE;
  • 达到上述 save 配置的任一条件;
  • SHUTDOWN 正常关闭时默认保存一次(可用 NOSAVE 跳过);
  • 主从建立全量同步时,主库生成 RDB 发给从库;
  • DEBUG RELOAD 等运维命令触发(生产慎用)。

启动加载

启动时若配置并存在 AOF 文件,Redis 优先加载 AOF(通常更新);未开 AOF 则加载 dump.rdb。加载成功后日志会出现类似 DB loaded from disk 的记录,可用日志或 INFO persistence 核对。

fork 与写时复制(COW)

BGSAVE 过程:主进程 fork 出子进程,由子进程把内存数据写成 RDB;期间父进程继续处理写请求,被修改的内存页先复制一份给父进程(Copy-On-Write),子进程看到的始终是 fork 时刻的一致快照。代价:大实例 fork 复制页表可能造成毫秒级停顿;保存期间被改的页会额外占用内存,内存紧张的大实例应避开高峰执行 BGSAVE。

远程备份与迁移

运行中的实例可用 redis-cli --rdb 直接把当前快照拉到本地做异地备份:

redis-cli --rdb /backup/redis-snapshot.rdb
# 输出:SYNC sent to master, writing … bytes to '/backup/redis-snapshot.rdb'

迁移时把 dump.rdb 拷到新机器,放进新实例的 dir 目录、保持 dbfilename 一致后启动即可。

优缺点

  • 优点:单一紧凑文件,便于备份迁移;恢复加载比 AOF 快;子进程写盘不阻塞主线程。
  • 缺点:按时间点快照,最后一次保存后的数据会丢(默认配置最坏丢约 60 秒内的写入);fork 大实例有短暂停顿与额外内存;超大数据量下全量快照偏重,常与 AOF 配合使用(见后续持久化章节)。

小结

RDB 快照持久化 = 手动 BGSAVE/SAVE + save 条件自动触发 + 启动自动加载。日常备份用 BGSAVE 或 redis-cli --rdb 拉快照文件;它简单可靠但会丢两次快照间的数据,能否接受取决于业务的数据丢失窗口。

笔记加载中…