Redis 删了 2GB 数据,内存却纹丝不动?深挖内存碎片的真相
Redis 删了 2GB 数据内存却纹丝不动深挖内存碎片的真相你有没有遇到过这样诡异的场景明明已经删除了大量 Key用top命令一看Redis 进程内存占用依然高居不下或者info memory告诉你 Redis 存储的数据只有 1GB但操作系统却显示进程吃掉了 3GB 内存还在报内存不足的错误别慌今天我们就来拆穿这个让无数 Redis 用户抓狂的内存幻术——内存碎片。一、先从一个灵魂问题开始假设你的 Redis 实例保存了5GB 的数据现在你删除了2GB此时 Redis 进程占用的内存会降到 3GB 左右吗答案大概率不会。很可能你用top命令看到的 RSS进程实际占用的物理内存页数依然在5GB 左右徘徊即便 Redis 里存储的数据只剩 3GB。这不是 Bug也不是 Redis 在耍你——背后有一套完整的内存管理逻辑。搞清楚这套逻辑你才能真正驾驭 Redis。二、Redis 的内存从哪来又到哪去了2.1 先设好 maxmemory这是底线在深入原理之前有一条铁律要先说清楚# 通过命令动态设置CONFIG SET maxmemory 100mb# 或者在 redis.conf 中配置maxmemory 100mb一定要设置maxmemory如果不设Redis 会无限制地为新数据分配内存直到系统内存耗尽最终导致应用程序报错OOM。虽然不至于宕机但你的业务已经完蛋了。当内存达到上限时会触发内存淘汰策略maxmemory_policy决定删除哪些数据腾出空间。2.2 Redis 的内存都花在哪里了Redis 进程的内存消耗主要由四个部分构成Redis 进程内存 ├── 自身启动内存可忽略很小 ├── 对象数据内存大头存储所有 Key-Value 数据 ├── 缓冲区内存 │ ├── client-output-buffer-limit客户端输出缓冲区 │ ├── 复制积压缓冲区主从复制用 │ └── AOF 缓冲区持久化用 └── 内存碎片隐形杀手对象数据内存占比最大所有 Key-Value 都在这里缓冲区内存大流量场景容易失控需要重点监控内存碎片隐形杀手明明有空间却无法使用2.3 用info memory看透内存状况想知道 Redis 内存的真实情况info memory是你最好的朋友127.0.0.1:6379info memory# Memoryused_memory:1132832# Redis 存储数据实际占用的内存used_memory_human:1.08M# 人类可读形式used_memory_rss:2977792# 操作系统视角进程占用的物理总内存RSSused_memory_rss_human:2.84M used_memory_peak:1183808# 历史内存占用峰值used_memory_peak_human:1.13M used_memory_lua:37888# Lua 引擎消耗的内存maxmemory:2147483648# 最大可用内存字节maxmemory_human:2.00G maxmemory_policy:noeviction# 当前内存淘汰策略mem_fragmentation_ratio:2.79# 内存碎片率重点关注其中最关键的指标是mem_fragmentation_ratio也就是内存碎片率内存碎片率 used_memory_rssOS 分配给 Redis 的物理内存 ÷ used_memoryRedis 实际存储数据的内存上面的例子里碎片率是2.79意味着操作系统分配给 Redis 2.84MB 的物理内存但 Redis 只用其中 1.08MB 存了数据另外 1.76MB 都是碎片和开销。三、内存碎片是什么一个电影院的比喻光说数字可能还不够直观来个生活化的例子。你和漂亮小姐姐去电影院看电影肯定希望坐在一起。现在影厅有8 个座位已经卖出了 4 张票还剩 4 个空位。但你打开选座界面一看座位分布 [已售] [空闲] [已售] [空闲] [已售] [空闲] [已售] [空闲]好巧不巧买票的人每隔一个座位买一张导致4 个空座位全是分散的无法买到两张相邻的票。你有再多的钱也买不到两张连座。内存碎片的本质就是这个问题空闲内存总量够用但不是连续的无法满足新的数据存储请求。四、内存碎片是怎么产生的内存碎片的产生主要有两大根源。4.1 内存分配器的好意Redis 默认使用jemalloc作为内存分配器也可选 glibc、tcmalloc。内存分配器并不是你要多少就给多少而是按照固定大小的内存块分配比如 8 字节、16 字节、32 字节……2KB、4KB 等固定档位。当你申请内存时jemalloc 会分配最接近且不小于申请量的固定大小空间。举个例子程序申请 1.5 KB → jemalloc 分配 2 KB → 多出 0.5 KB碎片 程序申请 22 字节 → jemalloc 分配 32 字节 → 多出 10 字节碎片这么做并非毫无道理——减少内存分配次数提升性能。比如你先写入 22 字节jemalloc 分配了 32 字节。后续再写入 10 字节时不需要再向操作系统申请内存直接用之前剩余的空间就行了。但代价就是每次分配都会产生少量边角料碎片。4.2 Key-Value 频繁修改和删除这是碎片产生的更主要原因。场景一修改 Key 导致碎片原始字符串占用 32 字节的内存块 修改后字符串只需要 20 字节 → 释放了 12 字节的空间 下一个请求需要申请 13 字节 → 刚释放的 12 字节空间不够用只能另外申请新空间 → 原来的 12 字节沦为碎片场景二删除 Key 导致 RSS 不降删除 Key 之后Redis 并不会立即把内存归还给操作系统。原因是底层内存分配器的管理机制——大多数已删除的 Key 依然与其他有效 Key 分配在同一个内存页中操作系统无法单独回收其中一部分内存页。这就解释了为什么删了 2GB 数据RSS 依然显示 5GB。不过这里有个好消息当你再次往 Redis 写入数据时RSS 不会继续增长因为内存分配器会优先复用之前释放的内存块。五、碎片率多少算危险mem_fragmentation_ratio 1 → 异常物理内存不够用Redis 在用 swap性能会极差 1 ≤ mem_fragmentation_ratio 1.5 → 正常合理范围 mem_fragmentation_ratio ≥ 1.5 → 警告碎片超过 50%需要处理当碎片率大于 1.5意味着操作系统分配给 Redis 的内存中有超过 1/3 都是碎片不仅是资源浪费还可能导致有内存却存不了数据的诡异问题。六、解决内存碎片的两种方式6.1 重启大法简单粗暴慎用最直接的方式就是重启 Redis重启后内存重新分配碎片自然消失。但代价不小未开启持久化数据全部丢失开启了持久化重启后需要用 RDB 或 AOF 恢复数据数据量大时恢复时间很长期间服务不可用高可用性大打折扣除非数据允许丢失或数据量极小否则不建议把重启当成常规手段。6.2 自动清理内存碎片Redis 4.0 推荐方案Redis 4.0 版本引入了自动内存碎片清理机制Active Defragmentation。原理类比电影院的场景已经在电影院里的观众互相协商把座位挪一挪让大家都聚在一起空出来一块连续的座位区。对 Redis 而言操作系统把分散在不同位置的数据依次挪动拼接到连续的内存空间再把原来占用的空间释放出来形成大块连续的空闲内存。开启自动清理CONFIG SET activedefragyes触发清理的条件两个条件同时满足才会触发# 条件一碎片占用的内存绝对值达到 200MBactive-defrag-ignore-bytes 200mb# 条件二碎片空间占 Redis 总分配空间的比例超过 20%active-defrag-threshold-lower20控制清理对性能的影响自动清理涉及内存数据的复制移动会占用 CPU 资源影响 Redis 处理请求的性能。通过以下两个参数控制 CPU 占用比例# 清理过程中占用 CPU 的时间比例下限保证清理任务能正常推进active-defrag-cycle-min20# 最少占用 20% CPU# 清理过程中占用 CPU 的时间比例上限超过立即停止避免影响业务active-defrag-cycle-max50# 最多占用 50% CPU这两个参数让清理任务在彻底清理和不影响业务之间找到平衡点——既不会因为清理任务太猛拖慢业务也不会因为资源太少导致碎片永远清不干净。七、一张图搞懂全流程Redis 内存问题排查与处理流程 │ ▼ 执行 info memory 查看 mem_fragmentation_ratio │ ┌───────┴───────┐ │ │ 1.5 ≥ 1.5 正常 碎片过多 无需处理 需要处理 │ ┌─────────┴──────────┐ │ │ 能接受短暂不可用 不能接受停服 │ │ 重启 开启自动碎片清理 数据量小时可用 activedefrag yes 合理设置触发条件 合理设置 CPU 占用上限八、完整配置参考# 1. 限制 Redis 最大内存必须设置maxmemory 4gb maxmemory_policy allkeys-lru# 2. 开启自动内存碎片清理activedefragyes# 3. 触发清理的条件active-defrag-ignore-bytes 200mb active-defrag-threshold-lower20# 4. 控制清理对性能的影响active-defrag-cycle-min20active-defrag-cycle-max50性能问题排查 Tip如果你发现 Redis 某段时间内响应变慢怀疑是碎片清理在捣鬼先看下activedefrag是否开启再把active-defrag-cycle-max调小比如从 50 调到 25观察延迟是否恢复正常。九、总结问题原因解决方案删数据后 RSS 不降内存分配器不立即归还内存给 OS正常现象再写入数据时会复用碎片率 1.5jemalloc 按固定块分配 频繁删改 Key开启activedefrag yes自动清理影响性能内存数据复制移动消耗 CPU调小active-defrag-cycle-maxRedis 报内存不足未设置 maxmemory立即设置maxmemory 淘汰策略记住这个公式和这个阈值内存碎片率 used_memory_rss ÷ used_memory 碎片率 1.5 → 无需处理 碎片率 ≥ 1.5 → 开启自动清理Redis 删了数据内存没降不是 Redis 的锅是内存碎片在作祟。搞懂原理配好参数让 Redis 的每一个字节都物尽其用。如果这篇文章对你有帮助欢迎点赞收藏有 Redis 内存相关的坑踩过的评论区聊聊

相关新闻

stm32是用杜邦线母头接核心板和调试器吗

stm32是用杜邦线母头接核心板和调试器吗

是的,必须用杜邦线母头(母对母,F-F)。因为核心板上的排针是公头(凸出来的针),DAP调试器上的接口也是公头,所以你需要用两头都是带锁扣(或不带锁扣)的母头杜邦…

2026/7/5 9:59:00 阅读更多 →
2026.2.24:AgentScope框架实战<四>:agentscope多智能体-轮询模式

2026.2.24:AgentScope框架实战<四>:agentscope多智能体-轮询模式

AgentScope框架实战<四>:agentscope多智能体-轮询模式 环境: Ubuntu-25.10 import os from agentscope.memory import InMemoryMemory from agentscope.formatter import DashScopeChatFormatter, DashScopeMultiAgentFormatter from agentscope.model import DashScopeCha…

2026/7/6 5:43:47 阅读更多 →
[TradeAI] OpenClaw 安装与运行教程 windows+mac

[TradeAI] OpenClaw 安装与运行教程 windows+mac

官网:https://openclaw.ai/ GitHub:https://github.com/openclaw/openclaw 官方文档: https://docs.openclaw.ai/zh-CN/ windows Step 1:安装 Git 官网下载并安装: https://git-scm.com/ 安装完成后,打开 PowerShell: git --version

2026/7/4 4:21:42 阅读更多 →

最新新闻

工业级条码扫描系统架构与核心技术解析

工业级条码扫描系统架构与核心技术解析

1. 工业级条码扫描系统架构解析LV30条码扫描器与MKV42F64VLH16微控制器的组合,构成了一个完整的工业级条码识别解决方案。这套系统在硬件设计上采用了模块化架构,主要包含三个核心部分:光学采集模块:LV30扫描器采用1/3英寸全局快门…

2026/7/6 7:13:06 阅读更多 →
STM32F439ZG驱动RGB灯带实现智能灯光控制系统

STM32F439ZG驱动RGB灯带实现智能灯光控制系统

1. 项目概述:用智能灯光打造沉浸式空间体验这个项目的核心目标是通过IN-PC55TBTRGB全彩LED灯带和STM32F439ZG高性能微控制器的组合,将普通空间转化为动态光影艺术装置。作为一名嵌入式开发工程师,我最近完成了这个智能灯光控制系统的完整实现…

2026/7/6 7:11:06 阅读更多 →
基于CEC1302与IN-PC55TBTRGB的环境光效系统设计

基于CEC1302与IN-PC55TBTRGB的环境光效系统设计

1. IN-PC55TBTRGB与CEC1302的硬件组合解析这个项目核心在于利用IN-PC55TBTRGB可编程RGB LED和CEC1302控制器,打造沉浸式环境照明系统。IN-PC55TBTRGB是Inolux推出的5x5mm可寻址RGB LED模块,采用串行移位寄存器设计,支持逐颗编程控制。实测单个…

2026/7/6 7:11:06 阅读更多 →
基于MC6470 IMU与dsPIC30F4011的运动控制系统设计

基于MC6470 IMU与dsPIC30F4011的运动控制系统设计

1. 项目背景与核心器件选型在工业自动化和机器人控制领域,精确的运动控制和位置感知一直是核心技术挑战。MC6470作为一款6自由度(6DOF)惯性测量单元(IMU),集成了三轴加速度计和三轴陀螺仪,能够提供高精度的运动追踪数据。而dsPIC30F4011是Mic…

2026/7/6 7:09:05 阅读更多 →
N_m3u8DL-RE流媒体下载:3个实用技巧轻松搞定在线视频保存

N_m3u8DL-RE流媒体下载:3个实用技巧轻松搞定在线视频保存

N_m3u8DL-RE流媒体下载:3个实用技巧轻松搞定在线视频保存 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE…

2026/7/6 7:07:05 阅读更多 →
基于74HC32与MKV44F64VLH16的智能键盘设计方案

基于74HC32与MKV44F64VLH16的智能键盘设计方案

1. 项目背景与核心需求在嵌入式系统开发中,按键输入是最基础也最频繁使用的人机交互方式之一。传统方案通常直接将机械按键连接到微控制器的GPIO引脚,但这种做法存在两个显著问题:一是按键抖动会导致误触发,二是占用宝贵的IO资源。…

2026/7/6 7:07:05 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻