Redis的RDB持久化使用及说明

 更新时间:2025年12月26日 14:11:50   作者:川贝枇杷膏cbppg  
这篇文章主要介绍了Redis的RDB持久化使用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Redis 的 RDB 持久化,本质是通过生成内存数据的快照文件.rdb来保存数据,Redis 重启时加载该文件即可恢复数据。

RDB 是 Redis 默认的持久化方式,支持手动触发自动触发两种模式,下面从核心机制、配置、操作步骤、恢复流程、优缺点等方面,详细说明如何使用 RDB 持久化。

一、RDB 持久化的核心原理

快照生成逻辑当触发 RDB 持久化时,Redis 会执行以下步骤:

  • Redis 主进程 fork 一个子进程(父子进程共享内存数据);
  • 子进程遍历内存中的数据,将其写入到一个临时的 RDB 文件中;
  • 子进程写入完成后,用临时文件替换旧的 RDB 文件(原子操作,保证文件完整性);
  • 子进程退出,主进程继续处理客户端请求。

关键:fork 操作会产生 ** 写时复制(Copy-On-Write)** 机制 —— 父子进程共享内存页,只有当主进程修改数据时,才会复制对应内存页,避免占用双倍内存。

RDB 文件特性

  • 文件名默认是 dump.rdb,是二进制压缩文件,体积小,便于传输和备份;
  • 一个 RDB 文件包含某一时刻 Redis 的全量数据快照,恢复时直接加载到内存,速度远快于 AOF 持久化。

二、RDB 持久化的触发方式

RDB 有两种触发方式:手动触发(按需执行)和自动触发(配置规则自动执行)。

手动触发(常用)

手动触发有两个命令:SAVE 和 BGSAVE,生产环境优先使用 BGSAVE

命令执行逻辑优点缺点适用场景
SAVE主进程直接生成 RDB 文件,阻塞所有客户端请求无需 fork 子进程,无内存开销阻塞 Redis,期间无法处理命令测试环境、数据量极小的场景
BGSAVE主进程 fork 子进程生成 RDB 文件,主进程不阻塞不影响 Redis 正常服务fork 子进程会消耗内存(大内存实例 fork 较慢)生产环境、日常备份

实操示例

# 1. 手动执行 BGSAVE(推荐)
127.0.0.1:6379> BGSAVE
Background saving started  # 提示:后台保存已启动

# 2. 查看 BGSAVE 执行状态(通过 INFO 命令)
127.0.0.1:6379> INFO persistence
# Persistence
rdb_changes_since_last_save: 0  # 上次保存后数据变化量
rdb_bgsave_in_progress: 0       # 0=未执行,1=正在执行
rdb_last_save_time: 1719234567  # 上次保存的时间戳
rdb_last_bgsave_status: ok      # 上次保存状态:ok=成功,err=失败

自动触发(配置规则)

通过修改 redis.conf 配置文件,设置数据变化触发条件,Redis 会在满足条件时自动执行 BGSAVE

核心配置项是 save <seconds> <changes>,格式为:save 时间窗口(秒) 数据变化次数,可以配置多个条件(满足任意一个即触发)。

配置示例(redis.conf)

# 900秒内至少1个键被修改 → 触发 BGSAVE
save 900 1
# 300秒内至少10个键被修改 → 触发 BGSAVE
save 300 10
# 60秒内至少10000个键被修改 → 触发 BGSAVE
save 60 10000

# 禁用自动触发 RDB(注释所有 save 配置,或添加下面一行)
# save ""

其他自动触发场景

  • 执行 FLUSHALL 命令:会清空所有数据,并生成一个空的 dump.rdb 文件(生产环境慎用)。
  • 主从复制时:主节点首次向从节点同步数据时,会自动执行 BGSAVE 生成 RDB 文件,发送给从节点。

三、RDB 持久化的核心配置(redis.conf)

除了 save 触发条件,redis.conf 中还有多个参数控制 RDB 的行为,关键配置如下:

配置项作用默认值示例
dbfilename指定 RDB 文件名dump.rdbdbfilename redis_6379.rdb(按端口命名,便于区分多实例)
dir指定 RDB 文件的保存目录(必须是目录,不是文件名).(当前目录)dir /var/lib/redis(推荐配置独立目录)
rdbcompression是否压缩 RDB 文件(LZF 压缩算法)yesrdbcompression yes(压缩后文件更小,略增加 CPU 开销)
rdbchecksum是否对 RDB 文件做校验和(CRC64 算法),保证文件完整性yesrdbchecksum yes(加载时校验,略增加 CPU 开销)

配置生效步骤

修改 redis.conf 后,重启 Redis 生效:

redis-server /etc/redis/redis.conf

验证配置:

127.0.0.1:6379> CONFIG GET dbfilename
1) "dbfilename"
2) "redis_6379.rdb"

127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/var/lib/redis"

四、RDB 持久化的数据恢复流程

Redis 重启时会自动加载 RDB 文件恢复数据,无需手动操作,恢复流程如下:

  • Redis 启动时,检查 dir 配置的目录下是否存在 dbfilename 指定的 RDB 文件;
  • 如果存在,加载 RDB 文件到内存;如果不存在,启动后数据为空;
  • 加载完成后,Redis 开始接受客户端请求。

注意:如果 Redis 同时开启了 AOF 持久化,则会优先加载 AOF 文件(因为 AOF 数据的实时性更高)。

验证数据恢复

手动执行 BGSAVE 生成 RDB 文件:

127.0.0.1:6379> SET name tom  # 写入测试数据
OK
127.0.0.1:6379> BGSAVE
Background saving started

停止 Redis:

redis-cli shutdown

重启 Redis,查看数据是否恢复:

redis-cli
127.0.0.1:6379> GET name
"tom"  # 数据成功恢复

五、RDB 持久化的优缺点

优点

  1. 恢复速度快:RDB 是全量快照文件,Redis 重启时直接加载到内存,比 AOF 逐行重放命令快得多。
  2. 文件体积小:二进制压缩格式,便于备份、归档和传输(适合用于定时备份)。
  3. 对主进程影响小BGSAVE 由子进程执行,主进程可以正常处理请求。

缺点

  1. 数据安全性低:RDB 是周期性快照,两次快照之间的数据会丢失(比如设置 save 900 1,如果 Redis 崩溃,最多会丢失 15 分钟的数据)。
  2. 大内存实例开销大fork 子进程时,会复制主进程的内存页表,大内存实例(如 10GB 以上)fork 耗时较长,期间 Redis 可能出现短暂卡顿。
  3. 无法实时持久化:不适合对数据实时性要求高的场景(如金融交易)。

六、RDB 持久化的最佳实践(生产环境)

  1. 配合 AOF 使用:开启 RDB+AOF 混合持久化(Redis 4.0+ 支持),兼顾 RDB 的恢复速度和 AOF 的数据安全性。
  2. 合理配置 save 参数:避免过于频繁触发 BGSAVE(如不要设置 save 10 1),防止 fork 操作频繁消耗资源;也不要设置太宽松(如 save 3600 1),避免数据丢失过多。
  3. 定期手动备份 RDB 文件:通过 BGSAVE 生成 RDB 文件后,复制到其他服务器或云存储(如 S3),作为灾难恢复的备份。
  4. 控制 Redis 内存大小:避免 Redis 内存过大(如超过 10GB),减少 fork 时的内存开销和卡顿时间。
  5. 监控 fork 耗时:通过 INFO stats 查看 latest_fork_usec(上次 fork 耗时,单位微秒),如果耗时过长(如超过 1 秒),需要优化内存或调整持久化策略。

总结

RDB 持久化是 Redis 的基础持久化方式,核心是通过快照文件保存全量数据,使用时需注意:

  • 手动触发用 BGSAVE,避免 SAVE 阻塞主进程;
  • 自动触发通过 redis.conf 的 save 参数配置,平衡性能和数据安全性;
  • 恢复时 Redis 自动加载 RDB 文件,AOF 开启时优先加载 AOF;
  • 生产环境建议 RDB+AOF 混合持久化,兼顾速度和安全性。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Redis 热 key 和大 key 问题小结

    Redis 热 key 和大 key 问题小结

    这篇文章主要介绍了Redis 热 key 和大 key 问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-04-04
  • redis由于目标计算机积极拒绝,无法连接的解决

    redis由于目标计算机积极拒绝,无法连接的解决

    这篇文章主要介绍了redis由于目标计算机积极拒绝,无法连接的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Spring Boot 整合Redis 实现优惠卷秒杀 一人一单功能

    Spring Boot 整合Redis 实现优惠卷秒杀 一人一单功能

    这篇文章主要介绍了Spring Boot 整合Redis 实现优惠卷秒杀 一人一单,在分布式系统下,高并发的场景下,会出现此类库存超卖问题,本篇文章介绍了采用乐观锁来解决,需要的朋友可以参考下
    2022-09-09
  • redis和mysql同步(双写一致性)的实现

    redis和mysql同步(双写一致性)的实现

    Redis 和 MySQL 的同步是现代应用中常见的需求,正确的同步方案能够提高系统的性能和数据一致性,本文介绍了几种常见的同步方式,下面就来详细的介绍一下,感兴趣的可以了解一下
    2025-09-09
  • Redis 对过期数据的处理方法

    Redis 对过期数据的处理方法

    这篇文章主要介绍了Redis 对过期数据的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • redis集群搭建过程(非常详细,适合新手)

    redis集群搭建过程(非常详细,适合新手)

    这篇文章主要介绍了redis集群搭建过程,Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群,具体搭建过程跟随小编一起看看吧
    2021-11-11
  • Redis源码设计剖析之事件处理示例详解

    Redis源码设计剖析之事件处理示例详解

    这篇文章主要为大家介绍了Redis源码设计剖析之事件处理示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Redis不仅仅是缓存,还是……

    Redis不仅仅是缓存,还是……

    Redis是一个开源的(BSD协议),内存中的数据结构存储,它可以用作数据库,缓存,消息代理。这篇文章主要介绍了Redis不仅仅是缓存,还是……,需要的朋友可以参考下
    2020-12-12
  • Redis在docker上安装、启动、停止和删除操作的完整指南

    Redis在docker上安装、启动、停止和删除操作的完整指南

    Redis是一个开源的键值对存储系统,常用于缓存、消息队列等场景,Docker 是一个轻量级的容器化平台,可以轻松地部署和运行各种应用,本文将详细介绍如何在 Docker 上安装、启动、停止和删除 Redis,需要的朋友可以参考下
    2025-08-08
  • Windows下搭建Redis哨兵集群模式的方法步骤

    Windows下搭建Redis哨兵集群模式的方法步骤

    哨兵模式,是基于主从复制模式,主从复制的优点全都拥有,并且主从可以实现自动切换,故障转移等功能,本文主要介绍了Windows下搭建Redis哨兵集群模式的方法步骤,文中通过图文介绍的非常详细,感兴趣的小伙伴们可以参考一下,需要的朋友可以参考下
    2023-09-09

最新评论