Redis内存使用耗尽情况分析

目录

1、内存上限介绍

1.1、产生原因

1.2、Redis的maxmemory限额

1.3、影响的命令与场景

2. 内存用完后的策略

2.1、淘汰策略分类

2.2、淘汰策略介绍

2.3、不同策略对比

3、常见业务示例

3.1、影响

3.2、监控与自动告警


前言

        在日常项目中,不知道你思考过没有redis的内存耗尽的情况?

如下所示:

具体行为:

当内存满时:

  • 读操作(如GET):可以正常进行
  • 写操作(如SET、LPUSH、SADD等):
    • 如果能通过淘汰策略释放一点空间,则写入继续
    • 如果根据策略无法再释放空间(比如noeviction),则直接返回错误:“OOM command not allowed when used memory > 'maxmemory'.”

风险:

  • 如果是noeviction(默认),Redis直接拒绝写入!
  • 如果淘汰策略被触发,你的“旧数据”就会被自动删除(可能有业务风险)。
  • 内存页碎片、fork快照等也会加速内存耗尽。
  • 极端情况下,如果宿主机内存被撑爆,系统可能直接kill掉Redis进程(OOM Killer)。

关于更多redis的介绍,可参考:对Redis组件的深入探讨_redis 磁盘 内存-CSDN博客文章浏览阅读1.3k次,点赞20次,收藏8次。前言在介绍redis的时候,先介绍下存储介质,磁盘和内存。通过对以下两种认识,对了解redis有着更深的理解。如下图所示:以上就是r。_redis 磁盘 内存 https://blog.csdn.net/weixin_50055999/article/details/147757520?spm=1011.2415.3001.5331


1、内存上限介绍

        Redis是内存数据库所有数据(Key/Value)都存放在内存(RAM)中,不像MySQL等主要用磁盘。

Redis的数据结构不仅要存储你的 key/value 数据,还要存储:

1、Key/value 相关的元数据(如过期信息)

2、Append Only File (AOF)

3、缓冲区复制缓冲区、客户端连接缓冲区等

所以实际内存消耗 = 数据+各种维护数据+内存碎片。

1.1、产生原因

1、数据总量超过maxmemory配置:

这是最常见情况:写入、缓存、业务量上涨、没有删除机制,累计到了上限。

2、未设置maxmemory,Redis自动用光了系统全部内存:

系统会自动kill Redis进程(Linux OOM Killer)。

3、AOF或RDB备份引起内存瞬时暴涨:

快照/流复制/fork过程占用大量额外内存

4、客户端缓冲区、复制缓冲区太大:

有些命令或者慢客户端导致缓冲区堆积

5、内存碎片率很高:

内存并不是100%利用,碎片率过高也会导致出现“看似还有容量,实际已用尽”的问题。

1.2、Redis的maxmemory限额

Redis 是基于内存的数据库,其总内存上限可通过maxmemory参数配置。

比如在redis.conf中:

maxmemory 1gb

如果你没有设置,理论上 Redis 可以用光宿主机所有可用内存,直到被Linux OOM杀死进程。

1.3、影响的命令与场景

1、影响所有产生新内存分配的命令

包括:set/hash/set/zset/list的增量写入命令,bitmap、hyperloglog…

2、以下命令不会报错

读命令(GET/EXISTS/SCAN等)

删除命令(DEL/EXPIRE/UNLINK)

清空命令(FLUSHDB、FLUSHALL)


2. 内存用完后的策略

        当 Redis 达到 maxmemory 限制(即内存“用完”),会按照配置的淘汰策略(maxmemory-policy参数)来处理新写入命令

如下图所示:

写请求 -> 检查used_memory|是否超maxmemory?/        \否         是|           |正常写   执行淘汰策略|能释放内存吗?/     \能       不能|           |正常写     返回OOM错误,写失败

2.1、淘汰策略分类

  • noeviction默认):不淘汰,拒绝写入,只允许读;
  • allkeys-lru:将所有key中最久未使用的key淘汰;
  • volatile-lru:只对设置了过期时间的key做lru淘汰;
  • allkeys-random:所有key随机淘汰;
  • volatile-random只对设置了过期的key随机淘汰;
  • volatile-ttl优先淘汰过期时间到期最早的key;
  • volatile-lfu、allkeys-lfu:最不常用的(Least Frequently Used)key被淘汰。

2.2、淘汰策略介绍

1、noeviction(默认)

只读不写: 所有新增key、修改key、增加元素的命令(如SET、LPUSH、HSET等) 统统返回错误(error),只允许读(GET等)。

(error) OOM command not allowed when used memory > 'maxmemory'.
  • 危险:
    • 业务写入完全中断
    • 可能造成数据库/队列/秒杀等核心数据业务丢失
    • 生产极其危险,尤其是做缓存穿透时容易击穿下游数据库

2、allkeys-lru

自动淘汰: 

        优先淘汰“最久未使用”的key(Least Recently Used),腾出空间让新数据写成功。

风险:

        部分“冷数据”被自动删掉,新数据继续写入,服务不中断,但有可能丢掉了有用的老数据。

3、volatile-lru

  • 只判断有过期时间(expire)的key
  • 只淘汰带过期时间的key,不带过期属性的key永远不会被删
  • 如果全是永久key,效果跟noeviction一样,容易写不进去

4、allkeys-random/volatile-random

  • allkeys-random:任意key随机淘汰
  • volatile-random:也只淘汰带过期的key,随机选择。

5、volatile-ttl

淘汰带过期时间里“快要到期”的key。

6、allkeys-lfu/volatile-lfu

淘汰最少被访问的key(Least Frequently Used),更智能。

2.3、不同策略对比

如下所示:

注意

  • 持久化(RDB/AOF)也有可能被影响,如果没法持久化新数据,有可能异常或数据丢失!
  • 主从同步、集群等同步数据也受maxmemory影响。

3、常见业务示例

3.1、影响

1、缓存:

        如果用作普通缓存,可以用allkeys-lru/allkeys-lfu让Redis自动“以空间换时间”。热点数据永远在,冷数据慢慢淘汰,更健康

2、持久化队列/核心计数/实时业务:

        如果Redis用作数据库功能(存放业务数据、消费队列),noeviction策略推荐。避免关键数据被误删。一旦写入超限应报警、扩容、限流,绝不随便丢“老数据”

3、大key、热key、慢客户端

某个大key占住大量内存,会加速爆表,需依据业务定期分析优化。

更多bigkey文章介绍,参考:

Redis中的bigkey的介绍及影响_redis 大key-CSDN博客文章浏览阅读1.2k次,点赞31次,收藏12次。什么是BigKey?为什么它成为Redis的性能杀手?BigKey指在Redis中key对应的value占用内存或元素数量超出业务合理阈值的键值对。_redis 大key https://blog.csdn.net/weixin_50055999/article/details/148856033?spm=1011.2415.3001.5331

4、内存暴涨瞬间写崩溃

       新增了超大key(如bitmap、大string、大list),远超单条key的预期,会导致写入命令的突然异常或长时间阻塞(尤其fork的时候)。

3.2、监控与自动告警

建议配合运维/监控工具(如Prometheus、Grafana、redis_exporter、阿里云/腾讯云云监控等)。

重点关注:

1、used_memory (info memory)。

2、maxmemory。

3、内存碎片率。

4、淘汰计数器evicted_keys。

5、命令拒绝计数rejected_connections


总结

        Redis的内存满了,不同的淘汰策略决定要不要丢弃已有数据腾空间,否则直接拒绝写入并报错,只能读不能写,业务必须配合好监控、限流和数据结构优化。


参考文章:

1、内存耗尽后,Redis会发生什么?_redis中key没有达到过期时间,但是内存满了会怎么样?-CSDN博客文章浏览阅读84次。作为一台服务器来说,内存并不是无限的,所以总会存在内存耗尽的情况,那么当 Redis 服务器的内存耗尽后,如果继续执行请求命令,Redis 会如何处理呢?_redis中key没有达到过期时间,但是内存满了会怎么样? https://blog.csdn.net/qq_30987095/article/details/143257130?ops_request_misc=%257B%2522request%255Fid%2522%253A%252295fab89f19b3cb10a23ea7030593bb32%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=95fab89f19b3cb10a23ea7030593bb32&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-143257130-null-null.142^v102^control&utm_term=redis%E5%86%85%E5%AD%98%E8%80%97%E5%B0%BD&spm=1018.2226.3001.4187

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916828.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 系统中配置 SSH 服务教程

一、什么是 SSH?SSH(Secure Shell)是一种加密的网络协议,用于在不安全的网络中安全地进行远程登录、远程命令执行和文件传输。它是 Telnet、FTP 等传统协议的安全替代品。二、确认系统环境在开始配置之前,请确认你的系…

基于springboot的编程训练系统设计与实现(源码+论文)

一、开发环境 技术/工具描述MYSQL数据库一个真正的多用户、多线程SQL数据库服务器,适用于Web站点或其他应用软件的数据库后端开发。B/S结构基于互联网系统的软件系统开发架构,利用浏览器进行访问,支持多平台使用。Spring Boot框架简化新Spri…

K8s集群两者不同的对外暴露服务的方式

在工作中,我们暴露集群内的服务通常有几种方式,对于普通的http或者https,我们通常使用​Ingress Nginx​ ,对于原始的TCP或者UDP端口服务,可能需要选择 ​LoadBalancer​ ,它们的核心区别在于工作层级、协议支持和流量…

实习日志111

第一天 加入内网和内网域,设置自己的操作系统 第二天 安装常用软件和平台 Notepad 是一款免费的源代码编辑器,支持多种编程语言,其功能强大且界面友好,适用于 Windows 操作系统。WinMerge 是一款开源的差异比较和合并工具&…

Redis 服务挂掉排查与解决

Redis 是一个高性能的键值对存储系统,广泛应用于缓存、会话存储、消息队列等场景。在使用 Redis 的过程中,偶尔会遇到 Redis 服务挂掉或无法连接的情况。本文将通过常见错误 RedisException in Redis.php line 63 Connection refused 来讲解如何排查并解…

DOM + HTML + HTTP

一、HTML5的新特性 1.语义化标签:其实就是可以让标签有自己的含义 html4之前都是有的,比如:<h1>、<ul>、<li> html5新增了很多语义化标签:<header>、<nav> html5的语义化标签的常用页面布局: 优点: 1.代码结构清晰,方便阅读,有利于团…

HTML 音频/视频

HTML 音频/视频 引言 HTML 音频和视频标签是网页设计中不可或缺的部分,它们为用户提供了一种将多媒体内容嵌入到网页中的方式。本文将详细介绍 HTML 音频/视频标签的用法、属性和注意事项,帮助开发者更好地在网页中嵌入音频和视频。 HTML 音频标签( ) 1. 标签基本用法 …

Apache Ignite Cluster Groups的介绍

以下这段内容是 Apache Ignite 官方文档中关于 Cluster Groups&#xff08;集群组&#xff09; 的介绍。我来用通俗易懂的方式帮你全面理解这个概念。&#x1f310; 什么是 Cluster Group&#xff1f; 简单来说&#xff1a;Cluster Group 就是一个“节点的子集”。想象一下你的…

github上传本地项目过程记录

最近有和别人进行unity项目协作的需求&#xff0c;需要把自己的本地代码上传到github已有的一个仓库里。记录一下上传过程&#xff0c;防止后续还需要用。 文章目录一、把自己的本地代码上传到github已有的一个仓库中二、常用功能一、把自己的本地代码上传到github已有的一个仓…

Spring AI Alibaba

目录 前言&#xff1a; 一、Spring AI 和Spring AI Alibaba 二、Spring AI Alibaba快速入门 1.环境 2.ollama 3.阿里百炼 前言&#xff1a; 2025年真的是AI大爆发的一年&#xff0c;以后无论是什么行业我想都需要AI了&#xff0c;作为一名计算机人&#xff0c;你不学习AI…

【GaussDB】内存资源告急:深度诊断一起“memory temporarily unavailable“故障

【GaussDB】诊断一起内存临时不可用的问题 &#x1f4cb; 背景 在客户测试环境中&#xff08;GaussDB 506.0 SPC0100 集中式&#xff09;&#xff0c;一个重度使用存储过程的系统&#xff0c;频繁出现内存临时不可用的问题(ERROR: memory is temporarily unavailable)。令人困…

FastDFS如何提供HTTP访问电子影像文件

Nginx 作为高性能的 Web 服务器和反向代理服务器&#xff0c;与 FastDFS 结合使用&#xff0c;本文主要介绍用于处理 FastDFS 存储文件的 HTTP 访问请求&#xff0c;方便客户端通过 HTTP 协议直接访问存储在 FastDFS 中的文件&#xff0c;在电子影像系统中&#xff0c;Nginx 可…

水面垃圾识别分割数据集labelme格式2111张8类别

数据集中有部分增强图片&#xff0c;注意为了提供模型泛化识别能力&#xff0c;有很少一部分不是水面垃圾。具体看图片数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件)图片数量(jpg文件个数)&#xff1a;2111标注数量(json文件…

北京-4年功能测试2年空窗-报培训班学测开-第六十二天-模拟未通过,继续准备自我介绍项目介绍面试题中

今日产出&#xff0c;完成昨天模拟面试录音的重听和整理&#xff0c;完成自我介绍梳理&#xff0c;还重写了三个算法题&#xff0c;写了4个sql题。和同学打语音提问今天专注力不强&#xff0c;因为焦虑项目和面试题。关于项目&#xff0c;我理解的&#xff0c;老师以前录屏讲的…

自动化辅助工具教程

该工具支持全部平台使用

里程碑 | 1Panel开源面板GitHub Star数量突破30,000个!

截至2025年7月23日20:00&#xff0c;飞致云旗下开源项目——1Panel开源Linux服务器运维管理面板GitHub Star数超过30,000个&#xff01; 继Halo之后&#xff0c;1Panel成为飞致云旗下第二个GitHub Star数量超过30,000个的开源项目&#xff0c;也是飞致云旗下最快达成30,000个Gi…

雨雪雾冰全预警:交通气象站为出行安全筑起“隐形防护网”

冬季浓雾弥漫高速&#xff0c;能见度降至 50 米以下&#xff1b;夏季暴雨倾盆&#xff0c;低洼路段眨眼间积水成河…… 恶劣天气总是公路交通安全的大敌。关键时刻&#xff0c;交通气象站挺身而出&#xff0c;成为保障道路畅通与行车安全的科技尖兵。交通气象站专为复杂道路环境…

C++(面向对象之继承、多态)

一、继承前言在c里面&#xff0c;继承是指2个类之间的关系例如&#xff1a;有一个org类&#xff0c;功能很完善&#xff0c;体量很大&#xff0c;突然有一天&#xff0c;需求发生改变&#xff0c;org类不能满足新的需求&#xff0c;我们的第一想法是&#xff0c;复制 org 类代码…

【数据可视化-75】北京密云区2025年7月暴雨深度分析:Python + Pyecharts 炫酷大屏可视化(含完整数据、代码)

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

Voxtral Mini:语音转文本工具,支持超长音频,多国语音

Voxtral是什么 Mistral AI 推出的 Voxtral 是一款强大的音频模型&#xff0c;专为语音交互打造&#xff0c;具备卓越的语音转写和语义理解能力。它提供 24B 和 3B 两种版本&#xff0c;分别适用于大规模生产和本地部署。Voxtral 支持多语言、长文本上下文、问答与总结&#xf…