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

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

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

下图是执行set hello world时,所涉及到的数据模子。

(1)dictEntry:Redis是Key-Value数据库,因此对每个键值对城市有一个dictEntry,内里存储了指向Key和Value的指针;next指向下一个dictEntry,与本Key-Value无关。

(2)Key:图中右上角可见,Key(”hello”)并不是直接以字符串存储,而是存储在SDS布局中。

(3)redisObject:Value(“world”)既不是直接以字符串存储,也不是像Key一样直接存储在SDS中,而是存储在redisObject中。现实上,岂论Value是5种范例的哪一种,都是通过redisObject来存储的;而redisObject中的type字段指明白Value工具的范例,ptr字段则指向工具地址的地点。不外可以看出,字符串工具固然颠末尾redisObject的包装,但如故必要通过SDS存储。

现实上,redisObject除了type和ptr字段以外,尚有其他字段图中没有给出,如用于指定工具内部编码的字段;后头会具体先容。

(4)jemalloc:无论是DictEntry工具,照旧redisObject、SDS工具,都必要内存分派器(如jemalloc)分派内存举办存储。以DictEntry工具为例,有3个指针构成,在64位呆板下占24个字节,jemalloc会为它分派32字节巨细的内存单位。

下面来别离先容jemalloc、redisObject、SDS、工具范例及内部编码。

2、jemalloc

Redis在编译时便会指定内存分派器;内存分派器可所以 libc 、jemalloc可能tcmalloc,默认是jemalloc。

jemalloc作为Redis的默认内存分派器,在减小内存碎片方面做的相比拟力好。jemalloc在64位体系中,将内存空间分别为小、大、庞大三个范畴;每个范畴内又分别了很多小的内存块单元;当Redis存储数据时,会选择巨细最吻合的内存块举办存储。

jemalloc分另外内存单位如下图所示:

 深入相识一下Redis的内存模子!

譬喻,假如必要存储巨细为130字节的工具,jemalloc会将其放入160字节的内存单位中。

3、redisObject

前面说到,Redis工具有5种范例;无论是哪种范例,Redis都不会直接存储,而是通过redisObject工具举办存储。

redisObject工具很是重要,Redis工具的范例、内部编码、内存接纳、共享工具等成果,都必要redisObject支持,下面将通过redisObject的布局来声名它是怎样起浸染的。

redisObject的界说如下(差异版本的Redis也许稍稍有所差异):

redisObject的每个字段的寄义和浸染如下:

(3.1)type

type字段暗示工具的范例,占4个比特;今朝包罗REDIS_STRING(字符串)、REDIS_LIST (列表)、REDIS_HASH(哈希)、REDIS_SET(荟萃)、REDIS_ZSET(有序荟萃)。

当我们执行type呼吁时,即是通过读取RedisObject的type字段得到工具的范例;如下图所示:

(3.2)encoding

encoding暗示工具的内部编码,占4个比特。

对付Redis支持的每种范例,都有至少两种内部编码,譬喻对付字符串,有int、embstr、raw三种编码。通过encoding属性,Redis可以按照差异的行使场景来为工具配置差异的编码,大大进步了Redis的机动性和服从。以列表工具为例,有压缩列表和双端链表两种编码方法;假如列表中的元素较少,Redis倾向于行使压缩列表举办存储,由于压缩列表占用内存更少,并且比双端链表可以更快载入;当列表工具元素较多时,压缩列表就会转化为更得当存储大量元素的双端链表。

通过object encoding呼吁,可以查察工具回收的编码方法,如下图所示:

5种工具范例对应的编码方法以及行使前提,将在后头先容。

(3.3)lru

lru记录的是工具最后一次被呼吁措施会见的时刻,占有的比特数差异的版本有所差异(如4.0版本占24比特,2.6版本占22比特)。

通过比拟lru时刻与当前时刻,可以计较某个工具的空转时刻;object idletime呼吁可以表现该空转时刻(单元是秒)。object idletime呼吁的一个非凡之处在于它不改变工具的lru值。

lru值除了通过object idletime呼吁打印之外,还与Redis的内存接纳有相关:假如Redis打开了maxmemory选项,且内存接纳算法选择的是volatile-lru或allkeys—lru,那么当Redis内存占用高出maxmemory指定的值时,Redis会优先选择空转时刻最长的工具举办开释。

(3.4)refcount

(3.4.1)refcount与共享工具

(编辑:河北网)

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

热点阅读