精选文章 redis——内存概述

redis——内存概述

作者:RabbitMQ!!! 时间: 2021-02-05 09:56:07
RabbitMQ!!! 2021-02-05 09:56:07
【摘要】Redis通过自己的方法管理内存,,主要方法有zmalloc(),zrealloc(), zcalloc()和zfree(), 分别对应C中的malloc(), realloc()、 calloc()和free()。相关代码在zmalloc.h和zmalloc.c中。 Redis自己管理内存的好处主要有两个:可以利用内存池等手段提高内存分配的性能;可以掌握更多的内存信息,以便于Redis虚拟...

Redis通过自己的方法管理内存,,主要方法有zmalloc(),zrealloc(), zcalloc()和zfree(), 分别对应C中的malloc(), realloc()、
calloc()和free()。相关代码在zmalloc.h和zmalloc.c中。
Redis自己管理内存的好处主要有两个:可以利用内存池等手段提高内存分配的性能;可以掌握更多的内存信息,以便于Redis虚拟内存(VM)等功能中,决定何时将数据swap到磁盘。
先回忆各个系统中常见的内存分配函数:
malloc()分配一块指定大小的内存区域,并返回指向区域开头的指针,若分配失败,则返回NULL。
calloc()与malloc()一样,分配一块指定大小的内存区域,成功时返回区域头指针,失败返回NULL。

区别在于, calloc()的输入参数为count和size,即分配的项的数
目,及每一项的大小。

calloc()在成功分配内存空间后,会将空间内所有值置0。
realloc()修改已分配的内存块的大小。若已分配的内存块后没有足够的空间用于扩展内存块,则重新申请一块满足需要的内存块,并将旧的数据拷贝到新位置,释放旧的内存块,返回指向新的内存块的指针;否则直接扩展原有的内存块。若分配失败,返回NULL。
free()释放已分配的内存块。
内存分配
在Redis中,如果系统中包含TCMALLOC,则会使用tc_malloc()等TCMALLOC中的方法代替malloc()等原有的分配内存方法。 TCmalloc是google perftools中的一个组件。

#if defined(USE_TCMALLOC)
#define malloc(size) tc_malloc(size)

首先看zmalloc()和zfree()两个最常用的方法。 Redis在申请内存时,除了申请需要的size外,还会多申请一块定长(PREFIX_SIZE)的区域用于记录所申请的内存块的长度。如果申请成功, Redis会使用宏函数(Redis中为性能考虑,大量使用宏函数)
update_zmalloc_stat_alloc(size+PREFIX_SIZE, size)记录申请的内存块的相关信息,以便监控内存使用状况;当内存块被zfree()释放时,根据头部的信息可以快速地获知被释放的内存区域的长度,然后通过宏函数update_zmalloc_stat_free()标记释放。源代码中,若系统支持malloc_size()方法,则会使用它返回指针所指向的内存块的大小(Mac OS X 10.4以上支持该方法[3])。 有疑惑的是,在支持malloc_size()的系统中,为何还要多申请PREFIX_SIZE的内存?
 

void *zmalloc(size_t size) { void *ptr = malloc(size+PREFIX_SIZE); if (!ptr) zmalloc_oom(size);
#ifdef HAVE_MALLOC_SIZE update_zmalloc_stat_alloc(redis_malloc_size(ptr),size); return ptr;
#else *((size_t*)ptr) = size; // 在头部记录内存块的长度 update_zmalloc_stat_alloc(size+PREFIX_SIZE,size); return (char*)ptr+PREFIX_SIZE;
#endif
}

宏update_zmalloc_stat_alloc()中,首先将要分配的空间与内存对齐,然后会根据宏zmalloc_thread_safe判断是否需要对内存信息记录表的相关操作加锁。虽然Redis在大部分场景中是单线程读写的,即thread_safe的,但启用虚拟内存(VM),或持久化dump到磁盘等操作时会启动多线程,因此在多线程模式中,需要对部分操作加锁。内存监控
used_memory记录了Redis使用的内存总数。而多线程下malloc()是线程安全的。
zmalloc_allocations[]记录了各个size分配的内存块的数目,大于256个字节的按256算。应用程序可以通过zmalloc_allocations_for_size(size)获得对应size的
内存块的分配数目;也可以通过zmalloc_used_memory()获得Redis占用的总内存。这些监控类的方法在Redis的日志系统中被用到。
zcalloc(size)、 zrealloc()与zmalloc()的处理策略类似,不再详述。
在部分操作系统中, Redis可以通过zmalloc_get_rss()方法获得自己的进程占用
的内存信息。该信息通过操作系统提供,往往比Redis自己记录的used_memory更准确,
但其获取速度也较慢。这些信息也是用于虚拟内存功能。
除了内存相关的操作外, Redis在此还提供了一个复制字符串的方法zstrdup(char
*),该方法将申请一块与源字符串长度相同的内存区域,并用memcpy()拷贝字符串的内
容。
 

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:Fraction to Recurring Decimal

下一篇:netty源码解析(4.0)-28 ByteBuf内存池:PooledByteBufAllocator-把一切组装起来

您可能感兴趣

  • Linux网络管理员手册(4) 第四章 设置串行硬件 Modem连接的通信软件 串行设备概述

    Linux网络管理员手册(4) 2000-07-28 17:34发布者:netbull 阅读次数:1276 翻译:赵炯 gohigh@shtdu.edu.cn 第四章 设置串行硬件 有这样的传言,在网络世界中有这样一些人,他们只有一台PC机并且钱去花在一根T1-互连网连接上。然而,为了进行他们的新闻(news)和邮件(mail)的日常工作,他们说是用公共电话网络,依靠SLIP连接、UUCP网...

  • Windows CE 的内存使用

    介绍     Microsoft®Windows® CE是组件化的操作系统,它可根据目标设备或平台的不同特点进行定制。原始设备制造商(OEM)或嵌入系统开发者可以选择所需的系统模块和组件,将其提供给用于目标平台的操作系统。所选择的模块和组件确定了它的内存需求情况。    一个模块表示一个完整的功能区域,在系统软件中可将其表示出也可以不将其表示出。如果不需要该功能,那么可以将整个模块忽略。例如...

  • WIN32汇编: 13.内存映射文件

    第十三课 内存映射文件 本课中我们将要讲解内存映射文件并且演示如何运用它。您将会发现使用内存映射文件是非常简单的。 理论: 如果您仔细地研究了前一课的例子, 就会发现它有一个严重的缺陷:如果您想读的内容大于系统分配的内存块怎么办?如果您想搜索的字符串刚好超过内存块的边界又该如何处理?对于第一个问题,您也许会说,只要不断地读就不解决了吗。至于第二个问题,您又会说在内存块的边界处做一些特别的...

  • 轻松取得winnt下的系统资源信息(cpu利用率,内存使用情况,线程数 )

    看到好多朋友询问怎样得到系统信息(象任务管理器一样),前段时间研究了一番,有所领悟,现与大家共享。   下面是部分测试代码: #include #include #include #include #include #define MAXPATH 80int __cdecl _tmain (int argc, TCHAR **argv){  HQUERY          hQuery;  ...

  • .NET体系中的源程序安全问题(一、概述)

    在Visual Studio.NET(VS.NET)体系中,VB、Visual C++以及C#之类的编译器把源程序编译成MSIL。MSIL即Microsoft Intermediate Language,或Microsoft中间语言,它在执行之前被即时(Just-In-Time Compile,JIT)编译成为机器语言。但是,你可能还没有深入了解当你在VS中点击Build按钮时发生了什么事情...

  • 用汇编语言编写内存修改器

    Windows汇编程序在编写不使用图形界面(或使用简单的图形界面)的32 位Windows应用程序时,使用汇编语言会使程序简单、快捷,并且这类程序生成的可执行文件比较小(一般不超过10K),执行速度快,无需安装即可运行。在Windows环境中,汇编语言的编程方式与C语言类似,要调用Windows API。在汇编语言中调用API函数使用call 指令,并且函数的参数使用Push指令先入堆栈,这...

  • 查找一个特定的EXE是否在内存中运行

    unit Find_Unit; interface uses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  StdCtrls, TLHelp32, ComCtrls; type  TFindForm = class(TForm)    Button1: TButton;    Edit1...

  • VB程序员的FTP编程指南1.1-文件传输协议FTP概述

    专 题:文件传输协议FTP概述主 讲:qianqian FTP简介 直到1994年,当WWW掌管Internet时,文件传输协议(FTP)是和e-mail一样最广泛应用的Internet客户程序。它被用于作为访问Internet主机文件的一个远程外壳。使用ftp可以连接到一个FTP服务器,在可用的目录间游历,并且传输文件。 一个FTP站点可以是公用的,私有的,或者两者兼有之。使用一个私有的账...

CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
redis——内存概述介绍:华为云为您免费提供redis——内存概述在博客、论坛、帮助中心等栏目的相关文章,同时还可以通过 站内搜索 查询更多redis——内存概述的相关内容。| 移动地址: redis——内存概述 | 写博客