当前位置: 首页 > news >正文

Redis 内存优化与管理机制(内存碎片、LRU、惰性删除、内存回收策略)

Redis 内存优化与管理机制(内存碎片、LRU、惰性删除、内存回收策略)

在这里插入图片描述

1. 前言

Redis 是内存数据库,高性能的同时也面临 内存压力
为了保证高效和稳定,Redis 设计了多层内存优化机制

  • 内存分配优化:Jemalloc 管理碎片
  • 内存回收策略:引用计数 + 惰性删除
  • 淘汰策略:LRU / LFU 控制数据量
  • 内存上限管理maxmemory 配置

2. 内存碎片与分配优化

2.1 内存碎片

  • Redis 使用 Jemalloc 避免碎片化

  • 内存碎片分为:

    1. 外部碎片:分配小块内存时,空闲块零散
    2. 内部碎片:分配大块内存时,未完全使用

2.2 Jemalloc 优势

  • 按大小分级:不同大小对象分配不同内存池
  • 减少系统调用:避免频繁 malloc/free
  • 统计内存使用:Redis 可以通过 INFO memory 查看

2.3 Redis 内存监控

INFO memory
  • used_memory:实际使用
  • used_memory_rss:操作系统分配内存
  • mem_fragmentation_ratio:碎片率

如果碎片率过高,可以考虑优化对象编码或升级 Redis。


3. LRU / LFU 淘汰策略

当 Redis 达到 maxmemory 限制时,需要 淘汰策略

3.1 常用策略

策略说明
noeviction不淘汰,写操作返回错误
allkeys-lru全局 LRU 淘汰
volatile-lru只淘汰设置了过期时间的 key
allkeys-lfu全局 LFU 淘汰
volatile-lfu只淘汰有过期时间的 key
volatile-ttl淘汰 TTL 最短的 key

3.2 LRU 原理

  • Redis 使用 近似 LRU
  • 不存储绝对访问时间,而是 16 位计数器
  • 每次访问 key,会随机更新计数器
  • 淘汰时随机扫描若干 key,选择计数最小的进行淘汰

3.3 源码分析

// expire.c
void activeExpireCycle(int type) {dict *dbdict = server.db[i].dict;for (j = 0; j < sample_size; j++) {key = randomKeyFromDict(dbdict);if (key.expired) deleteKey(key);}
}

Redis 并不扫描所有 key,而是 随机采样 + 淘汰最老,提高效率。


4. 惰性删除(Lazy Deletion)

4.1 概念

  • Key 设置了过期时间后,并不会立即删除
  • 访问时检查是否过期
  • 访问到过期 key → 删除并返回空值
if (expireTime < now) deleteKey(c->db,key);

4.2 定期删除

  • Redis 会周期性调用 activeExpireCycle() 清理过期 key
  • 结合惰性删除和定期删除,保证内存不被过期 key 堵塞

5. 内存回收策略

Redis 内存回收机制依赖以下几层:

5.1 引用计数

  • robj.refcount 记录对象引用
  • refcount == 0 → 调用 freeObject() 回收内存

5.2 惰性删除 + 定期删除

  • 避免阻塞主线程
  • 大对象删除时,可以使用 lazy free:后台异步释放
void freeObjAsync(robj *o) {if (o->type == OBJ_LIST || o->type == OBJ_SET)bioCreateBackgroundJob(BIO_LAZY_FREE, o);elsefreeObject(o);
}

5.3 内存上限控制

  • 通过 maxmemory 配置限制 Redis 最大占用
  • 达到上限 → 根据淘汰策略释放 key

6. 内存优化总结

Redis 内存优化体系包括:

  1. 内存分配优化:Jemalloc 减少碎片
  2. 引用计数 + 惰性删除:高效回收内存
  3. 淘汰策略(LRU / LFU / TTL):控制数据量
  4. 定期清理 + 异步释放:减少主线程阻塞
  5. 内存监控INFO memory,碎片率控制

通过这些机制,Redis 能在 高并发 + 内存受限 环境下稳定运行。


7. 小结

本文分析了 Redis 内存优化与管理机制:

  • 内存碎片管理:Jemalloc 提高分配效率,降低碎片率
  • LRU / LFU 淘汰:高效管理内存上限
  • 惰性删除 + 定期删除:过期 key 不占用过多资源
  • 引用计数 + 异步释放:避免阻塞主线程

📌 结合前面数据结构、对象系统和事件驱动机制,Redis 的内存管理体系得以完整、高效、可靠。


在这里插入图片描述

下一篇可以写 Redis 高可用实战源码解析(Sentinel + Cluster 整合应用),把之前高可用理论、复制、持久化和内存机制整合成一个实战案例。


文章转载自:

http://NockbFUj.mgfnt.cn
http://gnABhzg7.mgfnt.cn
http://8fiNcniz.mgfnt.cn
http://zu4o9RxY.mgfnt.cn
http://r6AR2zP3.mgfnt.cn
http://KAfdDtaq.mgfnt.cn
http://Sie32d7A.mgfnt.cn
http://XgUOd0q7.mgfnt.cn
http://lQl7zNMr.mgfnt.cn
http://SRkerV4b.mgfnt.cn
http://IgMXR38K.mgfnt.cn
http://RvacrXUP.mgfnt.cn
http://Pv4nZphY.mgfnt.cn
http://tcRIxxfv.mgfnt.cn
http://zVsGuJfm.mgfnt.cn
http://k1iXWpBb.mgfnt.cn
http://FfOzNddk.mgfnt.cn
http://2kh6I6SJ.mgfnt.cn
http://biMqCOMG.mgfnt.cn
http://jhjE2odI.mgfnt.cn
http://rGUFB22o.mgfnt.cn
http://bxBJe35x.mgfnt.cn
http://FfAo5tBq.mgfnt.cn
http://pcfz0tay.mgfnt.cn
http://7CEBktIs.mgfnt.cn
http://b0SQunoW.mgfnt.cn
http://9idDPkB6.mgfnt.cn
http://0QfjlpXU.mgfnt.cn
http://EtjnBne1.mgfnt.cn
http://izhbirJT.mgfnt.cn
http://www.dtcms.com/a/384864.html

相关文章:

  • 嵌入式学习day49-硬件-UART
  • 通信模组性能调优
  • Redis 实战指南:数据库选型 + 高可用(主从 / 哨兵)+ 集群搭建
  • 进程与线程:从入门到精通
  • Android 项目:画图白板APP开发(八)——Matrix位移放大缩小(附demo)
  • 【大前端++】【混合开发】【node】express 文件服务器本地搭建-模拟加载图片使用
  • 如何启动Greenplum中的某个segment
  • 校验用户身份是否过期,是否存在等等JWT
  • Docker 多阶段镜像构建与缓存利用性能优化实践指南
  • Jenkinsfile配置【1】
  • 2025年渗透测试面试题总结-72(题目+回答)
  • 网络安全相关搜索引擎
  • 【Unity性能优化——Stats面板】
  • 【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
  • AI如何赋能跨境支付,亚马逊云科技与PayerMax的联合探索
  • PAT乙级_1125 子串与子列_Python_AC解法_含疑难点
  • 华清远见25072班网络编程学习day6
  • 国标GB28181视频平台EasyGBS国标GB28181软件与公安数字化安防技术衔接方案
  • 我的Web开发实践笔记:从编码设置到项目运营
  • Regression Trees|回归树
  • [数据结构——Lesson14.快速排序]
  • 城乡供水一体化智慧水务管理系统方案——推动供水高质量发展的御控工业物联网解决方案
  • 云上安全的第一道门槛:身份与访问控制
  • Blender MCP—基于AI代理的智能三维建模协同框架
  • 从零开始打造复杂动作网页:现代CSS3动画与JavaScript交互完全指南
  • 基于 OpenCV 实现实时文档扫描:从轮廓检测到透视变换全流程解析
  • Qt 系统相关 - 事件2
  • iTwinjs GeoLocation
  • 【氮化镓】C缺陷络合物导致的GaN黄光发射
  • Docker 下部署 Elasticsearch 8 并集成 Kibana 和 IK 分词器