加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

深入了解一下Redis的内存模型!

发布时间:2019-03-17 06:46:40 所属栏目:编程 来源:编程迷思
导读:一、媒介 Redis是今朝最火爆的内存数据库之一,通过在内存中读写数据,大大进步了读写速率,可以说Redis是实现网站高并发不行或缺的一部门。 我们行使Redis时,会打仗Redis的5种工具范例(字符串、哈希、列表、荟萃、有序荟萃),富厚的范例是Redis相对付M
副问题[/!--empirenews.page--]

一、媒介

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行使内存的环境。

在客户端通过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中。

内存碎片的发生与对数据举办的操纵、数据的特点等都有关;另外,与行使的内存分派器也有相关:假如内存分派器计划公道,可以尽也许的镌汰内存碎片的发生。后头将要说到的jemalloc便在节制内存碎片方面做的很好。

假如Redis处事器中的内存碎片已经很大,可以通过安详重启的方法减小内存碎片:由于重启之后,Redis从头从备份文件中读取数据,在内存中举办重排,为每个数据从头选择吻合的内存单位,减小内存碎片。

四、Redis数据存储的细节

1、概述

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读