您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    能够是目前最详细的Redis内存模型及运用解读
    时间:2018-08-09 08:10 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    技术沙龙 | 8月25日与多位资深技术大咖讨论小顺序电商实战

    前言

    Redis是目前最火爆的内存数据库之一,经过在内存中读写数据,大大提高了读写速度,可以说Redis是完成网站高并发不可或缺的一部分。

    能够是目前最详细的Redis内存模型及运用解读

    我们运用Redis时,会接触Redis的5种对象类型(字符串、哈希、列表、集合、有序集合),丰厚的类型是Redis相关于Memcached等的一大优势。在了解Redis的5种对象类型的用法和特点的基础上,进一步了解Redis的内存模型,对Redis的运用有很大协助,例如:

    1、预算Redis内存运用量。目前为止,内存的运用成本依然相对较高,运用内存不能无所顾忌;依据需求合理的评价Redis的内存运用量,选择适宜的机器配置,可以在满足需求的状况下浪费成本。

    2、优化内存占用。了解Redis内存模型可以选择更适宜的数据类型和编码,更好的应用Redis内存。

    3、剖析处置成绩。当Redis出现阻塞、内存占用等成绩时,尽快发现招致成绩的缘由,便于剖析处置成绩。

    这篇文章主要引见Redis的内存模型(以3.0为例),包括Redis占用内存的状况及如何查询、不同的对象类型在内存中的编码方式、内存分配器(jemalloc)、复杂静态字符串(SDS)、RedisObject等;然后在此基础上引见几个Redis内存模型的运用。

    一、Redis内存统计

    工欲善其事必先利其器,在阐明Redis内存之前首先阐明如何统计Redis运用内存的状况。

    在客户端经过redis-cli衔接效劳器后(前面如无特殊阐明,客户端一概运用redis-cli),经过info命令可以查看内存运用状况:

    info memory 

    能够是目前最详细的Redis内存模型及运用解读

    其中,info命令可以显示redis效劳器的许多信息,包括效劳器基本信息、CPU、内存、耐久化、客户端衔接信息等等;memory是参数,表示只显示内存相关的信息。

    前往结果中比较重要的几个阐明如下:

    (1)used_memory:Redis分配器分配的内存总量(单位是字节),包括运用的虚拟内存(即swap);Redis分配器前面会引见。used_memory_human只是显示更友好。

    (2)used_memory_rss:Redis进程占据操作系统的内存(单位是字节),与top及ps命令看到的值是分歧的;除了分配器分配的内存之外,used_memory_rss还包括进程运转本身需求的内存、内存碎片等,但是不包括虚拟内存。

    因此,used_memory和used_memory_rss,前者是从Redis角度失掉的量,后者是从操作系统角度失掉的量。二者之所以有所不同,一方面是由于内存碎片和Redis进程运转需求占用内存,使得前者能够比后者小,另一方面虚拟内存的存在,使得前者能够比后者大。

    由于在实践运用中,Redis的数据量会比较大,此时进程运转占用的内存与Redis数据量和内存碎片相比,都会小得多;因此used_memory_rss和used_memory的比例,便成了权衡Redis内存碎片率的参数;这个参数就是mem_fragmentation_ratio。

    (3)mem_fragmentation_ratio:内存碎片比率,该值是used_memory_rss / used_memory的比值。

    mem_fragmentation_ratio普通大于1,且该值越大,内存碎片比例越大。mem_fragmentation_ratio<1,阐明Redis运用了虚拟内存,由于虚拟内存的媒介是磁盘,比内存速度要慢很多,当这种状况出现时,应该及时排查,假设内存不足应该及时处置,如添加Redis节点、添加Redis效劳器的内存、优化运用等。

    普通来说,mem_fragmentation_ratio在1.03左右是比较安康的形状(关于jemalloc来说);下面截图中的mem_fragmentation_ratio值很大,是由于还没有向Redis中存入数据,Redis进程本身运转的内存使得used_memory_rss 比used_memory大得多。

    (4)mem_allocator:Redis运用的内存分配器,在编译时指定;可以是 libc 、jemalloc或许tcmalloc,默许是jemalloc;截图中运用的便是默许的jemalloc。

    二、Redis内存划分

    Redis作为内存数据库,在内存中存储的内容主要是数据(键值对);经过前面的叙说可以知道,除了数据以外,Redis的其他部分也会占用内存。

    Redis的内存占用主要可以划分为以下几个部分:

    1、数据

    作为数据库,数据是最主要的部分;这部分占用的内存会统计在used_memory中。

    Redis运用键值对存储数据,其中的值(对象)包括5种类型,即字符串、哈希、列表、集合、有序集合。这5种类型是Redis对外提供的,实践上,在Redis外部,每种类型能够有2种或更多的外部编码完成;此外,Redis在存储对象时,并不是直接将数据扔进内存,而是会对对象停止各种包装:如redisObject、SDS等;这篇文章前面将重点引见Redis中数据存储的细节。

    2、进程本身运转需求的内存

    Redis主进程本身运转一定需求占用内存,如代码、常量池等等;这部分外存大约几兆,在大少数消费环境中与Redis数据占用的内存相比可以疏忽。这部分外存不是由jemalloc分配,因此不会统计在used_memory中。

    补充阐明:除了主进程外,Redis创立的子进程运转也会占用内存,如Redis执行AOF、RDB重写时创立的子进程。当然,这部分外存不属于Redis进程,也不会统计在used_memory和used_memory_rss中。

    3、缓冲内存

    缓冲内存包括:

    客户端缓冲区、复制积压缓冲区、AOF缓冲区等;

    其中,客户端缓冲存储客户端衔接的输入输入缓冲;

    复制积压缓冲用于部分复制功用;

    AOF缓冲区用于在停止AOF重写时,保存最近的写入命令。

    在了解相应功用之前,不需求知道这些缓冲的细节;这部分外存由jemalloc分配,因此会统计在used_memory中。

    4、内存碎片

    内存碎片是Redis在分配、回收物理内存进程中产生的。例如,假设对数据的更改频繁,而且数据之间的大小相差很大,能够招致redis释放的空间在物理内存中并没有释放,但redis又无法有效应用,这就构成了内存碎片。内存碎片不会统计在used_memory中。

    (责任编辑:admin)