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 拉快照文件;它简单可靠但会丢两次快照间的数据,能否接受取决于业务的数据丢失窗口。