Redis内存碎片详解

Redis内存碎片详解

1. 什么是内存碎片?

你可以将内存碎片简单地理解为那些不可用的空闲内存。

内存碎片(Memory Fragmentation)是指由于频繁的内存分配和释放,导致可用的内存空间变得不连续,从而影响内存利用率和性能。在 Redis 中,内存碎片通常指的是 Redis 向操作系统申请的内存与实际存储数据的内存之间的差值。

内存碎片的计算方式:
碎片率 = Redis 占用的物理内存 Redis 记录的内存使用量 碎片率 = \frac{\text{Redis 占用的物理内存}}{\text{Redis 记录的内存使用量}} 碎片率=Redis 记录的内存使用量Redis 占用的物理内存
其中:

  • Redis 占用的物理内存:Redis 进程在系统中实际使用的内存(由 info memory 中的 used_memory_rss 统计)。
  • Redis 记录的内存使用量:Redis 逻辑上存储数据所占的内存(由 info memory 中的 used_memory 统计)。
  • 碎片率大于 1.0 表示有内存碎片,碎片率越大,碎片越严重。

2. 为什么会有内存碎片?

Redis 的内存碎片主要来源于以下几个方面:

(1) 内存分配策略

Redis 默认使用 jemalloc 作为内存分配器(可以使用 jemallocglibc malloc),而 jemalloc 通过分配不同大小的内存块来管理内存。当某些键被删除或修改后,会导致内存块无法被完全回收,进而产生碎片。

(2) 数据的增删改
  • 大 key 的删除:当一个大对象(如大型 hashlistset)被删除时,其占用的内存可能不会立刻释放给操作系统,而是继续留在 Redis 进程中,形成碎片。
  • 数据更新:当一个 string 类型的键从 100B 扩展到 10KB,Redis 可能会重新分配新的更大的内存空间,旧的内存块可能无法完全复用,从而导致碎片。
(3) 内存回收机制
  • jemalloc 可能不会将空闲的内存立刻归还给操作系统,而是继续留在 Redis 进程中以备后续使用。
  • 操作系统本身的内存管理也可能导致碎片,例如 glibc malloc 使用 mmap/brk 分配内存,某些情况下释放的内存不会立刻回收。

3. 如何查看 Redis 的内存碎片?

可以通过 info memory 命令查看 Redis 的内存碎片情况,关注以下几个字段:

127.0.0.1:6379> info memory

输出示例:

used_memory:104857600         # Redis 逻辑上使用的内存(100MB)
used_memory_rss:157286400     # Redis 实际占用的物理内存(150MB)
mem_fragmentation_ratio:1.50  # 内存碎片率(1.5)

关键指标:

  • mem_fragmentation_ratio:内存碎片率。
    • < 1.0:可能 Redis 触发了 swap,数据被交换到磁盘,影响性能。
    • ≈ 1.0:内存利用率较好,没有明显的碎片问题。
    • > 1.2:可能有较多的内存碎片,影响性能。
    • > 1.5:内存碎片较严重,可能需要手动清理。

4. 如何清理 Redis 的内存碎片?

如果 mem_fragmentation_ratio 过高(通常 >1.3~1.5),可以采取以下措施来减少内存碎片:

(1) 触发 Redis 主动释放内存

可以通过 MEMORY PURGE(Redis 4.0+)来强制 jemalloc 释放空闲内存:

127.0.0.1:6379> MEMORY PURGE

这会通知 jemalloc 释放未使用的内存给操作系统,可能会减少 used_memory_rss,但不会影响 used_memory

(2) 重启 Redis

如果碎片严重,MEMORY PURGE 无法明显降低 mem_fragmentation_ratio,可以尝试重启 Redis:

$ systemctl restart redis

注意:重启 Redis 会导致数据丢失(如果没有持久化),在生产环境中应先做好备份。

(3) 重新加载数据

如果 Redis 使用 RDBAOF 持久化,可以尝试 SAVE + FLUSHALL + RELOAD

127.0.0.1:6379> SAVE           # 先保存当前数据到 RDB
127.0.0.1:6379> FLUSHALL       # 清空所有数据
127.0.0.1:6379> SYSTEM RELOAD  # 重新加载 RDB 文件

这样 Redis 会重新分配内存,降低碎片率。

(4) 调整 jemalloc 参数

如果 jemalloc 产生过多碎片,可以尝试手动调整参数,修改 Redis 启动命令:

MALLOC_CONF=background_thread:true,dirty_decay_time:300,stats_print:true redis-server

dirty_decay_time 影响 jemalloc 的回收策略,适当调整可能减少碎片。

(5) 控制大 key
  • 避免存储超大 hashlistset,可以拆分存储。
  • 采用 hash tag 方案,使数据分布在多个 key 上,而不是集中在一个 key 里。
(6) 设置 maxmemory-policy

如果 Redis 用于缓存,可以使用 volatile-lruallkeys-lru 策略,使数据更均衡地被淘汰,减少碎片:

127.0.0.1:6379> CONFIG SET maxmemory-policy allkeys-lru

5. 总结

方法适用场景影响
MEMORY PURGE碎片率 1.2~1.5轻量级,减少 RSS
Redis 重启碎片率 > 1.5影响业务,需备份
RDB 重新加载碎片率 > 1.3需启用持久化
jemalloc 参数调整长期优化需测试优化效果
避免大 key结构设计阶段预防性优化
maxmemory-policy缓存场景影响数据淘汰策略

如果 Redis 的 mem_fragmentation_ratio 过高,可以先尝试 MEMORY PURGE,如果无效则考虑重启 Redis 或优化数据结构。

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

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

相关文章

神聖的綫性代數速成例題12. 齊次方程組零解充要條件、其齊次方程組非零解、 齊次方程組基礎解系

1. 綫性空間的定義&#xff1a; 設是一個非空集合&#xff0c;是一個數域。 在集合的元素之間定義了加法運算&#xff0c;即對於任意&#xff0c;有唯一的&#xff0c;使得&#xff1b;在數域與集合的元素之間定義了數乘運算&#xff0c;即對於任意和&#xff0c;有唯一的&am…

万亿级数据量的OceanBase应用从JVM到协议栈立体化改造实现性能调优

本文基于某电商平台亿级商品详情页场景&#xff0c;通过Java应用层与数据库层的协同优化&#xff0c;实现98%的查询响应时间低于50ms。 一、JDBC连接池深度调优 HikariCP配置示例&#xff1a; HikariConfig config new HikariConfig(); config.setJdbcUrl("jdbc:ocean…

腾讯:《详解DeepSeek:模型训练、优化及数据处理的技术精髓》23页|附下载方法

导 读 INTRODUCTION 这是一篇来自腾讯的关于DeepSeek大语言模型及其技术特点、应用场景和未来发展趋势的文章&#xff0c;主要介绍了DeepSeek的核心技术优势、行业应用案例以及在AI领域的竞争力和发展趋势。为理解DeepSeek大语言模型的技术优势和应用前景提供了深入的分析&…

Vue 入门到实战 五

第5章 过渡与动画 目录 5.1 单元素/组件过渡 5.1.1 过渡class 5.1.2 CSS 过渡 5.1.3 CSS 动画 5.1.4 同时使用过渡和动画 5.1.5 JavaScript 钩子方法 5.2 多元素/组件过渡 5.2.1 多元素过渡 5.2.2 多组件过渡 5.3 列表过渡 5.3.1 列表的普通过渡 5.3.2 列表的平滑…

L2TP实验

一、拓朴图 二、实验配置 1.基础配置 1.1接口IP及服务配置 [PPPoE Client]interface GigabitEthernet 0/0/0 [PPPoE Client-GigabitEthernet0/0/0]service-manage all permit [NAS]interface GigabitEthernet 0/0/0 [NAS-GigabitEthernet0/0/0]ip add 192.168.0.2 24 [NAS-Gi…

简单实用!百度AI + Raphael AI = 免费生图

简单实用&#xff01;百度AI Raphael AI 免费生图 -- ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b55eda9141d34697b05db0cd60f62b75.png#pic_center) 第一步&#xff1a;下载或截取一些好看的图片当参考图片 第二步&#xff1a;用百度AI描述你想要的图片&…

aws(学习笔记第三十四课) dockerized-app with asg-alb

文章目录 aws(学习笔记第三十四课) dockerized-app with asg-alb学习内容&#xff1a;1. 整体架构1.1 代码链接1.2 代码手动修改部分1.2.1 rds_stack.py1.2.2 efs_stack.py1.2.3 asg_stack.py1.2.4 userdata.sh 1.2 整体架构 2.代码解析2.1 全体app.py2.2 NetworkStatck网络2.3…

面试总结之 Glide自定义的三级缓存策略

一、为什么需要三级缓存&#xff1f; 在移动应用开发中&#xff0c;图片加载性能直接影响用户体验。根据 Google 统计&#xff0c;图片加载延迟超过 1 秒会导致 32% 的用户流失。传统图片加载方案存在以下痛点&#xff1a; 内存占用高&#xff1a;未压缩的大图直接占用大量内…

用Python实现交互式数据可视化:从基础图表到动态仪表板

用Python实现交互式数据可视化&#xff1a;从基础图表到动态仪表板 一、项目背景 本文将通过一个完整的Python项目&#xff0c;展示如何使用Plotly和ipywidgets构建从基础统计到动态交互的全栈数据可视化方案。 二、核心功能模块 1. 数据生成与预处理 np.random.seed(100)…

Linux进程信号

1.信号的认识 生活中例如闹钟&#xff0c;红绿灯&#xff0c;电话铃声等都属于信号&#xff0c;所白了信号就是中断我们正在做的事情&#xff0c;属于进行事件异步通知机制。 在Linux中信号是发给进程的&#xff0c;信号的产生相较于进程是异步的。 信号的相关知识点&#xff…

Java使用FFmpegFrameGrabber进行视频拆帧,结合Thumbnails压缩图片保存到文件夹

引入依赖 <dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.17</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>ja…

c++项目-KV存储-模仿redis实现kv键值对存储的基本功能。

KV存储引擎的技术解析&#xff1a;数组、哈希与红黑树实现及其在网络I/O中的应用。 内容概要&#xff1a;本文档深入介绍了基于数组、哈希表和红黑树的键值存储引擎的设计与实现。文档首先阐述了系统的总体架构与类图关系&#xff0c;之后分别对底层存储结构进行了详细解释&am…

vue3:十一、主页面布局(优化页面跳转方式)

:router"true" 一、参考文章 vue3:十一、主页面布局(实现基本左侧菜单右侧内容效果)-CSDN博客 参考上述文章可知&#xff0c;页面跳转是通过在js中定义的菜单中携带的path&#xff0c;然后通过菜单的点击事件完成的跳转&#xff0c;现在可以进行优化&#xff0c;直…

深入解析 Java Stream API:筛选子节点的优雅实现!!!

&#x1f680; 深入解析 Java Stream API&#xff1a;筛选子节点的优雅实现 &#x1f527; 大家好&#xff01;&#x1f44b; 今天我们来聊聊 Java 8 中一个非常常见的操作&#xff1a;使用 Stream API 从 Map 中筛选出特定条件的元素。&#x1f389; 具体来说&#xff0c;我们…

统计学重要概念:自由度

在统计学中&#xff0c;自由度&#xff08;degrees of freedom&#xff0c;简称df&#xff09;是一个重要的概念&#xff0c;它表示在计算某个统计量时可以自由变化的值的数量。对于一个样本量为n的样本&#xff0c;自由度通常为n-1&#xff0c;这是因为我们需要用样本数据来估…

数据结构-排序

文章目录 1. 排序的概念2. 常见排序算法的实现2.1 插入排序1&#xff09;插入排序一&#xff09;基本思想二&#xff09;特性及时间复杂度三&#xff09;代码实现 2&#xff09;希尔排序&#xff08;缩小增量排序&#xff09;一&#xff09;基本思想二&#xff09;特性及时间复…

压缩壳学习

壳是什么 壳就是软件的一个保护套&#xff0c;防止软件被进行反编译或被轻易地修改。 其作用就是为了保护软件。 常见的大类壳有压缩壳、加密壳、VM 壳的分类。 压缩壳顾名思义就是用来减小软件的文件大小的&#xff1b;加密壳&#xff0c;通过加密软件来保护软件&#xff…

《AI大模型趣味实战》第6集:基于大模型和RSS聚合打造个人新闻电台

《AI大模型趣味实战》第6集&#xff1a;基于大模型和RSS聚合打造个人新闻电台 摘要 本文将带您探索如何结合AI大模型和RSS聚合技术&#xff0c;打造一个功能丰富的个人新闻电台系统。我们将使用Python和PyQt5构建一个桌面应用程序&#xff0c;该应用可以从多个RSS源抓取新闻&…

(学习总结29)Linux 进程概念和进程状态

Linux 进程概念 冯诺依曼体系结构软件运行与存储分级数据流动的理论过程 操作系统操作系统(Operator System) 概念操作系统的功能与作用系统调用和库函数概念 进程概念描述进程 - PCBtask_struct查看进程通过系统调用获取进程标示符 PID通过系统调用 fork 函数创建进程简单使用…

LLM - CentOS上离线部署Ollama+Qwen2.5-coder模型完全指南

文章目录 离线安装OllamaOllama下载Ollama硬件需求Ollama 常用命令参考Ollama安装Ollama 服务管理&开机启动开启局域网访问 Ollama 服务 离线安装模型gguf 文件格式下载Qwen2.5-Coder-7B-Instruct-GGUF格式选择 ( gguf 版本 )构建Modelfile文件加载并运行离线模型测试 集成…