43人参与 • 2025-12-26 • Redis
redis 的 rdb 持久化,本质是通过生成内存数据的快照文件(.rdb)来保存数据,redis 重启时加载该文件即可恢复数据。
rdb 是 redis 默认的持久化方式,支持手动触发和自动触发两种模式,下面从核心机制、配置、操作步骤、恢复流程、优缺点等方面,详细说明如何使用 rdb 持久化。
快照生成逻辑当触发 rdb 持久化时,redis 会执行以下步骤:
fork 一个子进程(父子进程共享内存数据);关键:fork 操作会产生 ** 写时复制(copy-on-write)** 机制 —— 父子进程共享内存页,只有当主进程修改数据时,才会复制对应内存页,避免占用双倍内存。
rdb 文件特性
dump.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 文件,发送给从节点。除了 save 触发条件,redis.conf 中还有多个参数控制 rdb 的行为,关键配置如下:
| 配置项 | 作用 | 默认值 | 示例 |
|---|---|---|---|
| dbfilename | 指定 rdb 文件名 | dump.rdb | dbfilename redis_6379.rdb(按端口命名,便于区分多实例) |
| dir | 指定 rdb 文件的保存目录(必须是目录,不是文件名) | .(当前目录) | dir /var/lib/redis(推荐配置独立目录) |
| rdbcompression | 是否压缩 rdb 文件(lzf 压缩算法) | yes | rdbcompression yes(压缩后文件更小,略增加 cpu 开销) |
| rdbchecksum | 是否对 rdb 文件做校验和(crc64 算法),保证文件完整性 | yes | rdbchecksum 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"
redis 重启时会自动加载 rdb 文件恢复数据,无需手动操作,恢复流程如下:
dir 配置的目录下是否存在 dbfilename 指定的 rdb 文件;注意:如果 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" # 数据成功恢复
bgsave 由子进程执行,主进程可以正常处理请求。save 900 1,如果 redis 崩溃,最多会丢失 15 分钟的数据)。fork 子进程时,会复制主进程的内存页表,大内存实例(如 10gb 以上)fork 耗时较长,期间 redis 可能出现短暂卡顿。save 参数:避免过于频繁触发 bgsave(如不要设置 save 10 1),防止 fork 操作频繁消耗资源;也不要设置太宽松(如 save 3600 1),避免数据丢失过多。bgsave 生成 rdb 文件后,复制到其他服务器或云存储(如 s3),作为灾难恢复的备份。fork 时的内存开销和卡顿时间。fork 耗时:通过 info stats 查看 latest_fork_usec(上次 fork 耗时,单位微秒),如果耗时过长(如超过 1 秒),需要优化内存或调整持久化策略。rdb 持久化是 redis 的基础持久化方式,核心是通过快照文件保存全量数据,使用时需注意:
bgsave,避免 save 阻塞主进程;redis.conf 的 save 参数配置,平衡性能和数据安全性;以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论