当前位置: 代码网 > it编程>数据库>Redis > Redis bgsave的使用小结

Redis bgsave的使用小结

2026年04月01日 Redis 我要评论
什么是bgsave?bgsave 是 redis 用于生成 rdb 持久化文件的核心操作,它的本质是:主线程 fork 一个子进程,子进程会独立遍历 redis 内存数据,将其序列化并写入磁盘(生成.

什么是bgsave?

bgsave 是 redis 用于生成 rdb 持久化文件的核心操作,它的本质是:

  • 主线程 fork 一个子进程,子进程会独立遍历 redis 内存数据,将其序列化并写入磁盘(生成.rdb 文件);
  • 整个过程中,主线程完全不参与数据遍历,仍能正常处理业务请求。

什么时候会用到bgsave?

定期备份

定期备份策略

# 生产环境典型备份计划
0 2 * * * /usr/local/bin/redis-backup.sh  # 每天凌晨2点执行
# 备份脚本示例
#!/bin/bash
redis-cli bgsave
wait_for_bgsave_complete
cp /var/lib/redis/dump.rdb /backup/redis/dump-$(date +%y%m%d).rdb

适用场景

  • 数据库每日/每周全量备份
  • 灾备恢复准备
  • 数据迁移前的快照

数据迁移

源服务器:
redis-cli bgsave
scp dump.rdb new-server:/path/to/redis/
目标服务器:
systemctl stop redis
cp dump.rdb /var/lib/redis/
systemctl start redis

故障排查与数据分析

# 使用rdb文件进行分析
redis-cli bgsave
# 等待完成后使用工具分析
rdb --command memory dump.rdb --bytes 128 --largest 10 // 大key分析

分析场景

  • 查找内存泄漏原因
  • 分析大key分布
  • 优化数据结构设计

aof重写机制

# aof重写内部流程
1. redis-cli bgrewriteaof
2. redis执行fork()创建子进程
3. 子进程基于当前数据生成新的aof文件
4. 实际上就是执行了一次bgsave+命令回放

** aof重写 = bgsave + 命令回放**

主从复制初始化

# 新从节点加入集群时
主节点流程:
1. 接收到slaveof命令
2. 执行bgsave创建rdb快照
3. 将rdb文件发送给从节点
4. 从节点加载rdb完成初始化

bgsave会存在哪些问题?

gsave 会导致 “业务抖动” 和 “实例抖动”。

bgsave 虽然不阻塞主线程,但会占用大量系统资源(cpu、内存、磁盘 io) ,这些资源抢占会间接影响 redis 服务和依赖它的业务,具体体现在三个方面:

1. cpu 抢占

cpu 抢占:导致业务请求响应变慢(业务抖动)

bgsave 子进程的核心工作是 “遍历内存数据 + 序列化 + 写磁盘”,这三个步骤都需要消耗 cpu。比如:子进程要把一个 1gb 的哈希表序列化到磁盘,需要持续占用 cpu 进行数据结构解析和二进制编码 —— 如果单机 cpu 是 4 核,子进程可能会占用 1 核的 80% 以上资源。

而 redis 主线程(处理业务请求)也需要 cpu:比如执行hget user:100 name需要解析 key、查找哈希表、返回结果。当子进程抢占大量 cpu 时,主线程能拿到的 “cpu 时间片” 会减少,直接导致:

  • 正常情况下 12ms 就能响应的请求,延迟可能飙升到 1020ms;
  • 高并发场景(如每秒 10 万请求)下,部分请求会因超时被业务端重试,甚至返回失败 —— 这就是 “业务请求抖动”。

2. 内存复制

内存复制:可能触发 “内存交换”(redis 实例抖动)

bgsave 子进程创建时,会用到 linux 的写时复制(copy-on-write,cow)  机制,这个机制是为了 “节省内存”,但也可能引发新问题。

cow 的逻辑是:

  • 子进程刚创建时,不直接拷贝主线程的内存数据,而是和主线程共享同一块内存;
  • 只有当主线程修改某块内存(比如执行set key new_val)时,系统才会 “复制” 这块内存的旧版本给子进程(确保子进程能拿到修改前的数据,生成一致快照)。

如果 redis 内存占用很高(比如 16gb 内存用了 14gb),且 bgsave 期间有大量写操作(比如每秒 1 万次set),会发生什么?

  • 大量内存被 “复制”:主线程每修改一块内存,就会生成一份副本,导致系统可用内存骤降;
  • 触发 swap(内存交换):当可用内存不足时,操作系统会把部分内存数据写到磁盘的 “交换分区”(swap 分区),而磁盘 io 速度比内存慢 1000 倍以上;
  • redis 实例卡顿:主线程要读取被交换到磁盘的数据时,需要等待磁盘 io,响应延迟会从毫秒级变成百毫秒级,甚至出现 “实例短暂无响应”—— 这就是 “redis 服务实例抖动”。

3. 磁盘 io 抢占

磁盘 io 抢占:拖慢 aof 持久化(雪上加霜)

如果你的 redis 同时开启了 aof 持久化(appendonly yes,生产环境大多会开),bgsave 还会和 aof 抢占磁盘 io 资源。

aof 的逻辑是:主线程执行修改命令后,会把命令写入 aof 缓冲区,再由后台线程定期将缓冲区内容刷到磁盘(默认每秒一次,appendfsync everysec)。

而 bgsave 子进程需要把 16gb 的内存数据写入磁盘(生成.rdb 文件),会占用大量磁盘写 io—— 比如原本 aof 刷盘每秒只需要 10mb io,bgsave 执行时磁盘写 io 可能飙升到 100mb/s,导致:

  • aof 刷盘延迟:原本 1ms 能完成的刷盘,变成 20ms;
  • 主线程等待刷盘:如果 aof 缓冲区满了,主线程会暂时阻塞等待刷盘完成,进一步加剧业务请求延迟。

到此这篇关于redis bgsave的使用小结的文章就介绍到这了,更多相关redis bgsave使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • Redis缓存预热的概念及方法详解

    Redis缓存预热的概念及方法详解

    1. 什么叫「缓存预热」?预热 = 项目启动后、用户访问前,提前把数据存进 redis。也就是:不让用户第一次访问时才去建缓存,而是我们自己提前把缓存建好。这就... [阅读全文]
  • Redis连接与查询的实用操作指南

    欢迎阅读本文。当我们需要深入排查缓存问题或验证数据一致性时,直接使用redis-cli是最有效的手段。但在此之前,你需要知道服务在哪、如何认证以及使用哪些命令。本文精简了冗余理论,…

    2026年03月27日 数据库
  • Redis的主从同步与对象模型详解

    淘汰策略当内存达到max_memory(在redis.conf中进行配置,主机内存96g,则设置为48g,因为持久化需要fork一份当前redis的快照)首先明确淘汰策略并不会检测…

    2026年03月27日 数据库
  • Redis配置只读账号实现方式

    一、需求说明作为一名运维工程师,经常安装和配置redis,前阵子有测试同事申请开一个redis的只读账户,以往都是配置一个读写用户,并没有对redis的权限进行细化管理,实际上这种…

    2026年04月08日 数据库
  • 深入剖析 Redis 的三种集群方式以及实战配置

    深入剖析 Redis 的三种集群方式以及实战配置

    redis作为高性能内存数据库,其集群化部署是解决单节点性能瓶颈与实现高可用的关键。本篇将深入剖析三种主流的集群方式:主从复制、哨兵模式(sentinel)与官... [阅读全文]
  • Redis缓存更新策略详解

    Redis缓存更新策略详解

    1. 主动更新-4种核心缓存更新策略核心原则:根据业务的 “读写比例”“一致性要求”“性能要求&rd... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com