当前位置:

首页 > 编程开发 > Redis在内存分配和使用统计的技巧有哪些

Redis在内存分配和使用统计的技巧有哪些

Redis Assistant
Redis Assistant

Redis Assistant 是一款为Redis设计的高效可视化管理与监控工具,提供多种操作模式,高效处理服务器数据。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

立即下载
¥19
Windows/macOS/Linux 2026-08-17
正版软件 Windows macOS软件 Linux 数据库管理工具

  具体来说就是:  若系统中存在Google的TC_MALLOC库,则使用tc_malloc一族函数代替原本的malloc一族函数。  若当前系统是Mac系统,则使用中的内存分配函数。  其他情况,在每一段分配好的空间前头,同时多分配一个定长的字段,用来记录分配的空间大小。  源代码分别在config.h和zmalloc.c中:  /*config.h*/  #ifdefined(USE_TCMALLOC)  #include  #ifTC_VERSION_MAJOR>=1&&TC_VERSION_MI

  具体来说就是:

  若系统中存在Google的TC_MALLOC库,则使用tc_malloc一族函数代替原本的malloc一族函数。

  若当前系统是Mac系统,则使用中的内存分配函数。

  其他情况,在每一段分配好的空间前头,同时多分配一个定长的字段,用来记录分配的空间大小。

  源代码分别在 config.h 和 zmalloc.c 中:

  /* config.h */

  #if defined(USE_TCMALLOC)

  #include

  #if TC_VERSION_MAJOR >= 1 && TC_VERSION_MINOR >= 6

  #define HAVE_MALLOC_SIZE 1

  #define redis_malloc_size(p) tc_malloc_size(p)

  #endif

  #elif defined(__APPLE__)

  #include

  #define HAVE_MALLOC_SIZE 1

  #define redis_malloc_size(p) malloc_size(p)

  #endif

  /* zmalloc.c */

  #ifdef HAVE_MALLOC_SIZE

  #define PREFIX_SIZE (0)

  #else

  #if defined(__sun)

  #define PREFIX_SIZE (sizeof(long long))

  #else

  #define PREFIX_SIZE (sizeof(size_t))

  #endif

  #endif

  因为 tc_malloc 和 Mac平台下的 malloc 函数族提供了计算已分配空间大小的函数(分别是tc_malloc_size和malloc_size),所以就不需要单独分配一段空间记录大小了。而针对linux和sun平台则要记录分配空间大小。对于linux,使用sizeof(size_t)定长字段记录;对于sun os,使用sizeof(long long)定长字段记录。也就是上边源码中的 PREFIX_SIZE 宏。

  那么这个记录有什么用呢?答案是,为了统计当前进程到底占用了多少内存。在 zmalloc.c 中,有这样一个静态变量:

  static size_t used_memory = 0;

  它记录了进程当前占用的内存总数。每当要分配内存或是释放内存的时候,都要更新这个变量。因为分配内存的时候,可以明确知道要分配多少内存。但是释放内存的时候,(对于未提供malloc_size函数的平台)仅通过指向要释放内存的指针是不能知道释放的空间到底有多大的。这个时候,上边提到的PREFIX_SIZE定长字段就起作用了,可以通过其中记录的内容得到空间的大小。zmalloc函数如下(去掉无关代码):

  void *zmalloc(size_t size) {

  void *ptr = malloc(size+PREFIX_SIZE);

  if (!ptr) zmalloc_oom(size);

  *((size_t*)ptr) = size;

  update_zmalloc_stat_alloc(size+PREFIX_SIZE,size);

  return (char*)ptr+PREFIX_SIZE;

  #endif

  }

  Redis在内存分配和使用统计方面有哪些技巧

  看到在分配空间的时候,空间大小是size+PREFIX_SIZE。对于mac系统或是使用tc_malloc的情况,PREFIX_SIZE 为0。之后将ptr指针指向的空间前size_t中记录分配空间的大小。最后返回的是越过记录区的指针。zfree函数类似(去掉无关代码):

  void zfree(void *ptr) {

  void *realptr;

  size_t oldsize;

  if (ptr == NULL) return;

  realptr = (char*)ptr-PREFIX_SIZE;

  oldsize = *((size_t*)realptr);

  update_zmalloc_stat_free(oldsize+PREFIX_SIZE);

  free(realptr);

  #endif

  }

  先将指针向前移动PREFIX_SIZE,然后取出分配空间时保存的空间长度。最后free整个空间。

  update_zmalloc_stat_alloc(__n,__size) 和 update_zmalloc_stat_free(__n) 这两个宏负责在分配内存或是释放内存的时候更新used_memory变量。定义成宏主要是出于效率上的考虑。将其还原为函数,就是下边这个样子:

  void update_zmalloc_stat_alloc(__n,__size)

  {

  do {

  size_t _n = (__n);

  size_t _stat_slot = (__size < ZMALLOC_MAX_ALLOC_STAT) ? __size : ZMALLOC_MAX_ALLOC_STAT;   if (_n&(sizeof(long)-1)) _n += sizeof(long)-(_n&(sizeof(long)-1));   if (zmalloc_thread_safe) {   pthread_mutex_lock(&used_memory_mutex);   used_memory += _n;   zmalloc_allocations[_stat_slot]++;   pthread_mutex_unlock(&used_memory_mutex);   } else {   used_memory += _n;   zmalloc_allocations[_stat_slot]++;   }   } while(0)   }   void update_zmalloc_stat_free(__n)   {   do {   size_t _n = (__n);   if (_n&(sizeof(long)-1)) _n += sizeof(long)-(_n&(sizeof(long)-1));   if (zmalloc_thread_safe) {   pthread_mutex_lock(&used_memory_mutex);   used_memory -= _n;   pthread_mutex_unlock(&used_memory_mutex);   } else {   used_memory -= _n;   }   } while(0)   }   代码中除了更新used_memory变量外,还有几个要关注的地方:   先对_n的低位向上取整,最后_n变为sizeof(long)的倍数,比如对于32位系统,sizeof(long) == 100(二进制),_n向上取整之后,低两位都变为0。   如果进程中有多个线程存在,则在更新变量的时候要加锁。   在zmalloc函数中还有一个统计量要更新:zmalloc_allocations[]。   在 zmalloc.c 中,zmalloc_allocations是这样定义的:   size_t zmalloc_allocations[ZMALLOC_MAX_ALLOC_STAT+1];   其作用是统计程序分配内存时,对不同大小空间的请求次数。统计的空间范围从1字节到256字节,大于256字节的算为256。统计结果通过调用 zmalloc_allocations_for_size 函数返回:   size_t zmalloc_allocations_for_size(size_t size) {   if (size > ZMALLOC_MAX_ALLOC_STAT) return 0;

  return zmalloc_allocations[size];

  }

  另一个对内存使用量的统计通过调用 zmalloc_used_memory 函数返回:

  size_t zmalloc_used_memory(void) {

  size_t um;

  if (zmalloc_thread_safe) pthread_mutex_lock(&used_memory_mutex);

  um = used_memory;

  if (zmalloc_thread_safe) pthread_mutex_unlock(&used_memory_mutex);

  return um;

  }

  另外 zmalloc.c 中,还针对不同的系统实现了 zmalloc_get_rss 函数,在linux系统中是通过读取/proc/$pid/stat文件获得系统统计的内存占用量。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发
相关文章 更多
codex安装windows 命令行完整操作教程
codex安装windows 命令行完整操作教程

详解Windows环境下安装OpenAI Codex CLI的步骤,包括WSL环境检查、Node.js/npm配置、npm全局安装命令及首次启动验证,适合开发者快速上手。

NativeRest环境配置要求与完整操作教程
NativeRest环境配置要求与完整操作教程

学习如何配置 NativeRest REST API 客户端。涵盖 Windows/macOS/Linux 安装后的工作区创建、环境变量管理、请求编辑及响应查看步骤,帮助开发者快速完成基础环境搭建与连通性测试。

CSS设置透明度的注意事项有哪些?opacity属性详解
CSS设置透明度的注意事项有哪些?opacity属性详解

深入解析CSS中设置透明度的核心属性opacity,剖析子元素继承、事件穿透、层叠上下文等关键注意事项,并提供与rgba、hsla的实用选型对比。

flutter页面传值到后台的方法及示例代码
flutter页面传值到后台的方法及示例代码

flutter页面传值到后台的完整实现方法及示例代码,帮助读者快速掌握相关技术要点。

Java 8至21新特性代码写法对比:Lambda、Record与Switch
Java 8至21新特性代码写法对比:Lambda、Record与Switch

本文通过具体的旧版与新版代码对比,详细剖析Java 8引入的Lambda表达式、Java 14/16引入的Record类,以及Java 12至21逐步演进完善的Switch表达式与模式匹配,展示代码简化路径与避坑要点。

AI智能体开发培训课程学什么及实战内容介绍
AI智能体开发培训课程学什么及实战内容介绍

系统梳理AI智能体开发培训的核心知识模块、技术栈选型与典型实战项目,解析低代码平台与纯代码框架的差异,提供从零构建可落地智能体的完整学习与实施路径。

Java子类未实现抽象方法编译错误修复指南
Java子类未实现抽象方法编译错误修复指南

针对Java开发中常见的“子类未实现抽象方法”编译错误,深入分析报错原因,提供重写实现、声明抽象子类两种标准修复路径,并总结参数签名、访问修饰符等典型避坑要点。

解决PHP递归报错:max_nesting_level限制与内存溢出处理
解决PHP递归报错:max_nesting_level限制与内存溢出处理

遇到PHP递归报错时,不要盲目调大max_nesting_level。本文教你区分Xdebug限制、内存耗尽和正则递归错误,提供代码级的终止条件优化与迭代替代方案,彻底解决栈溢出问题。

PHP递归中static变量与引用传递的常见陷阱及调试
PHP递归中static变量与引用传递的常见陷阱及调试

本文分析PHP递归中static变量导致的状态污染及引用传递引发的共享数据修改问题。提供具体的代码复现、缓存键设计建议及调试打印技巧,帮助开发者避免隐蔽的逻辑错误。

PHP递归性能优化技巧与迭代替代方案
PHP递归性能优化技巧与迭代替代方案

解析PHP递归函数在树形数据处理中的性能瓶颈,提供预加载数据消除I/O、使用显式栈替代深层递归的实战方案,帮助开发者在代码可读性与执行效率间做出合理取舍。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

WINDOWS 更多
3dmax(3ds max)
3dmax(3ds max)
Windows

Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

即将离开本站
您即将前往第三方网站,请确认是否继续?