Redis BGSAVE 内存不足异常完美解决方案

 更新时间:2026年03月09日 09:28:22   作者:蒙眼过河  
这篇文章详细介绍了Redis BGSAVE内存不足异常的解决方案,包括紧急恢复、根本修复和长期优化三个方面,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,感兴趣的朋友跟随小编一起看看吧

Redis BGSAVE 内存不足异常完整解决方案

一、问题背景与核心报错解析

项目无法正常登录,核心报错日志如下:

Handling error: RedisPipelineException, Pipeline contained one or more invalid commands; 
nested exception is io.lettuce.core.RedisCommandExecutionException: 
MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. 
Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). 
Please check the Redis logs for details about the RDB error

Redis 侧补充日志:

WARNING overcommit_memory is set to 0! 
Background save may fail under low memory condition. 
To fix this issue add ‘vm.overcommit_memory = 1' to /etc/sysctl.conf 
and then reboot or run the command ‘sysctl vm.overcommit_memory=1' for this to take effect.

错误本质
Redis 执行 BGSAVE(后台生成 RDB 快照)时,需要 fork 子进程来处理持久化,但操作系统因内存分配策略限制,无法为子进程分配足够内存,导致 RDB 持久化失败。而 Redis 默认开启 stop-writes-on-bgsave-error yes,会直接禁用所有写操作,最终引发业务访问异常。

二、分阶段解决方案

1. 紧急恢复(治标):临时解除写操作限制

适用于生产环境需快速恢复业务的场景,无需重启 Redis,但仅解决当前访问问题,未修复根本原因。

# 进入 Redis 客户端
redis-cli
# 临时关闭写操作限制(重启 Redis 后失效)
127.0.0.1:6379> config set stop-writes-on-bgsave-error no
# 验证配置生效
127.0.0.1:6379> config get stop-writes-on-bgsave-error

2. 根本修复(治本):调整系统内存分配策略

修改 vm.overcommit_memory 参数,解决 Redis fork 子进程内存分配失败问题:

# 1. 编辑系统内核参数配置文件
vim /etc/sysctl.conf
# 2. 添加/修改如下配置(建议放在文件末尾)
vm.overcommit_memory=1
# 3. 使配置立即生效(无需重启服务器)
sysctl -p
# 4. 验证配置生效
sysctl vm.overcommit_memory
# 预期输出:vm.overcommit_memory = 1

三、关键参数深度解析

1. vm.overcommit_memory 三种取值对比

取值策略名称核心逻辑适用场景风险点
0启发式策略(默认)分配内存时,对比「申请的虚拟内存」与「空闲物理内存+swap」,不足则拒绝普通服务器、内存充足场景Redis fork 子进程易失败,触发 RDB 持久化报错
1允许内存超分配直接放行所有内存申请,不做校验Redis 服务器、数据库服务器极端内存不足时触发系统 OOM 杀进程
2禁止内存超分配内存分配上限 = 物理内存 × overcommit_ratio(默认50%)+ swap对稳定性要求极高的核心服务器动态创建子进程/申请内存易失败

2. Redis stop-writes-on-bgsave-error 参数

取值行为适用场景
yes(默认)RDB 持久化失败时,禁用所有写操作数据一致性优先的场景(如金融、核心业务)
noRDB 持久化失败时,仍允许写操作可用性优先的场景(临时恢复)

四、扩展优化建议

  • 调整 Redis 持久化策略
    • 若 RDB 频繁失败,可降低快照频率(修改 save 参数),或结合 AOF 持久化:
# 示例:关闭自动 RDB 快照(仅保留手动 BGSAVE)
127.0.0.1:6379> config set save ""
# 开启 AOF 持久化(可靠性更高)
127.0.0.1:6379> config set appendonly yes
  • 注意:AOF 需配置合理的刷盘策略(如 appendfsync everysec),平衡性能与可靠性。
  • 优化 Redis fork 性能
    • fork 耗时与 Redis 内存使用量正相关,建议限制 Redis 最大内存(maxmemory),避免内存占用过高:
127.0.0.1:6379> config set maxmemory 4GB
127.0.0.1:6379> config set maxmemory-policy allkeys-lru

开启 transparent_hugepage 禁用(THP 会增加 fork 耗时):

echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 永久生效:添加到 /etc/rc.local
  • 监控 Redis 持久化状态
    • 定期检查 RDB/AOF 持久化状态,避免问题复发:
# 查看最后一次 BGSAVE 状态
127.0.0.1:6379> info persistence
# 关键指标:rdb_last_bgsave_status(成功为 ok)、aof_last_write_status
  • 服务器内存规划
    • Redis fork 子进程时,理论上需要与父进程相同的内存空间(实际用写时复制),建议服务器物理内存预留 20% 以上空闲,或配置足够的 swap 空间。

总结

  1. 紧急恢复:通过 config set stop-writes-on-bgsave-error no 临时解除 Redis 写限制,快速恢复业务访问;
  2. 根本修复:修改系统内核参数 vm.overcommit_memory=1,解决 fork 子进程内存分配失败问题;
  3. 长期优化:结合调整 Redis 持久化策略、限制最大内存、监控持久化状态,避免问题复发。

到此这篇关于Redis BGSAVE 内存不足异常完整解决方案的文章就介绍到这了,更多相关redis bgsave内存不足异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Redis和数据库的一致性(Canal+MQ) 的实现

    Redis和数据库的一致性(Canal+MQ) 的实现

    本文主要介绍了Redis和数据库的一致性(Canal+MQ),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-06-06
  • 巧用Redis实现分布式锁详细介绍

    巧用Redis实现分布式锁详细介绍

    大家好,本篇文章主要讲的是巧用Redis实现分布式锁详细介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Redis集群模式和常用数据结构详解

    Redis集群模式和常用数据结构详解

    Redis集群模式下的运维指令主要用于集群的搭建、管理、监控和维护,讲解了一些常用的Redis集群运维指令,本文重点介绍了Redis集群模式和常用数据结构,需要的朋友可以参考下
    2024-03-03
  • Spring boot+redis实现消息发布与订阅的代码

    Spring boot+redis实现消息发布与订阅的代码

    这篇文章主要介绍了Spring boot+redis实现消息发布与订阅,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值需要的朋友可以参考下
    2020-04-04
  • redis中的配置以及密码设置方式

    redis中的配置以及密码设置方式

    这篇文章主要介绍了redis中的配置以及密码设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Redis使用布隆过滤器解决缓存雪崩的问题

    Redis使用布隆过滤器解决缓存雪崩的问题

    布隆过滤器可以帮助我们解决Redis缓存雪崩的问题,那什么是布隆过滤器、布隆过滤器又是如何使用如何解决缓存雪崩的问题的,让我们带着这一系列的问题去详细了解布隆过滤器,感兴趣的小伙伴跟着小编一起来看看吧
    2024-02-02
  • Redis实现IP限流的2种方式举例详解

    Redis实现IP限流的2种方式举例详解

    通俗的说限流就是限制一段时间内用户访问资源的次数,减轻服务器压力,这篇文章主要给大家介绍了关于Redis实现IP限流的2种方式,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • Redis 内存淘汰策略深度解析(最新推荐)

    Redis 内存淘汰策略深度解析(最新推荐)

    本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Random等,并分析了它们的应用场景,同时,文章还介绍了Redis内存淘汰的底层实现,包括LRU/LFU的近似算法和淘汰流程,感兴趣的朋友一起看看吧
    2025-03-03
  • SpringBoot 开启Redis缓存及使用方法

    SpringBoot 开启Redis缓存及使用方法

    用redis做缓存,是因为redis有着很优秀的读写能力,在集群下可以保证数据的高可用,那么今天通过本文给大家讲解下SpringBoot使用Redis的缓存的方法,感兴趣的朋友一起看看吧
    2021-08-08
  • 如何提高Redis服务器的最大打开文件数限制

    如何提高Redis服务器的最大打开文件数限制

    文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-01-01

最新评论