RedisRDB持久化全量快照

wen java案例 1

Redis RDB 持久化全量快照详解

RDB(Redis Database)是 Redis 的持久化方式之一,通过创建内存数据的全量快照来实现持久化。

RedisRDB持久化全量快照

核心原理

RDB 将某一时刻的 Redis 内存数据完整地保存到一个二进制文件中(默认 dump.rdb),相当于给内存数据拍了张"照片"。

触发方式

手动触发

# SAVE - 同步方式,会阻塞 Redis 服务器
redis> SAVE
# BGSAVE - 异步方式,fork子进程后台处理(推荐)
redis> BGSAVE

自动触发(配置)

# 在 redis.conf 中配置 save 规则
save 900 1      # 900秒内至少有1个key变化
save 300 10     # 300秒内至少有10个key变化
save 60 10000   # 60秒内至少有10000个key变化

其他触发场景

  • 主从复制时,主节点自动生成 RDB 文件
  • 执行 SHUTDOWN 命令
  • 执行 FLUSHALL 命令(生成空快照)

RDB 文件结构

+-------------------+ 
| "REDIS" (5字节)   |  ← 魔数标识
+-------------------+
| RDB版本号 (4字节)  |
+-------------------+
| 辅助字段           |  ← redis版本、创建时间等
+-------------------+
| 数据库数据          |  ← 实际数据(键值对)
|   - DB编号         |
|   - 哈希表大小       |
|   - 过期时间        |
|   - 键(字符串)     |
|   - 值(编码)       |
+-------------------+
| EOF (1字节)       |  ← 结束标记
+-------------------+
| 校验和 (8字节)     |  ← CRC64校验
+-------------------+

执行流程(BGSAVE)

客户端发送 BGSAVE 命令
2. Redis 主进程检查:
   - 是否已有子进程在执行 BGSAVE
   - 是否已有子进程在执行 AOF 重写
3. 主进程 fork() 子进程
   ├── 主进程:继续处理客户端请求(使用写时复制技术)
   └── 子进程:将内存数据写入临时 RDB 文件
4. 子进程完成写入后:
   - 用临时文件替换旧的 RDB 文件(原子操作)
   - 向父进程发送信号通知完成
5. 父进程更新统计信息

写时复制机制

  • fork 时:父子进程共享内存页
  • 数据修改时:被修改的内存页会复制一份给子进程
  • 优势:即使使用子进程,内存消耗也只是被修改的数据量,而非整个数据集

优缺点分析

优点 ✅

  1. 紧凑高效:RDB 文件是二进制压缩的,比 AOF 文件小
  2. 恢复快速:加载 RDB 文件比 AOF 重放快得多
  3. 性能较好:fork 子进程处理,主进程几乎不受影响
  4. 适合备份:可以定期保存 RDB 文件作为历史快照

缺点 ❌

  1. 存在数据丢失风险:最近一次快照后的数据可能丢失
  2. fork 开销:数据量大时 fork 会耗时间(取决于内存大小)
  3. 无法实时持久化:快照生成有时间间隔

配置优化建议

# 保存触发条件
save 900 1
save 300 10
save 60 10000
# RDB 文件压缩(默认 yes,建议开启)
rdbcompression yes
# 是否检查 RDB 文件校验和(默认 yes)
rdbchecksum yes
# RDB 文件名
dbfilename dump.rdb
# RDB 文件保存目录
dir /data/redis/
# 当磁盘错误时是否停止写入(推荐 yes)
stop-writes-on-bgsave-error yes

恢复数据

  • 自动恢复:启动 Redis 时自动加载
  • 加载顺序:优先 AOF(若同时开启),RDB 作为备选
  • 手动恢复:复制 RDB 文件到配置目录,重启 Redis

监控与诊断

# 查看持久化状态
redis> INFO Persistence
# 关键字段解读:
- rdb_last_save_time: 最后成功保存时间戳
- rdb_bgsave_in_progress: 是否正在执行 BGSAVE
- rdb_last_bgsave_status: 最后一次 BGSAVE 状态
- rdb_current_bgsave_time_sec: 当前 BGSAVE 已执行秒数

最佳实践

  1. 混合持化方案:RDB + AOF 组合使用
  2. 备份策略:定期将 RDB 文件备份到远程存储
  3. 内存监控:fork 时内存可能翻倍,需预留足够内存
  4. 延迟设置:根据业务容忍度调整 save 触发条件
  5. 版本兼容:低版本 Redis 无法加载高版本 RDB 文件

RDB 适合对数据完整性要求不高但追求恢复速度的场景,比如缓存数据、可以容忍少量数据丢失的业务系统。

抱歉,评论功能暂时关闭!