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

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

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

通过图中可以看出,双端链表同时生涯了表头指针和表尾指针,而且每个节点都有指向前和指向后的指针;链表中生涯了列表的长度;dup、free和match为节点值配置范例特定函数,以是链表可以用于生涯各类差异范例的值。而链表中每个节点指向的是type为字符串的redisObject。

压缩列表:压缩列表是Redis为了节省内存而开拓的,是由一系列非凡编码的持续内存块(而不是像双端链表一样每个节点是指针)构成的次序型数据布局;详细布局相比拟力伟大,略。与双端链表对比,压缩列表可以节减内存空间,可是举办修改或增删操纵时,伟大度较高;因此当节点数目较少时,可以行使压缩列表;可是节点数目多时,照旧行使双端链表划算。

压缩列表不只用于实现列表,也用于实现哈希、有序列表;行使很是普及。

(3)编码转换

只有同时满意下面两个前提时,才会行使压缩列表:列表中元素数目小于512个;列表中全部字符串工具都不敷64字节。假若有一个前提不满意,则行使双端列表;且编码只也许由压缩列表转化为双端链表,反偏向则不行能。

下图展示了列表编码转换的特点:

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

个中,单个字符串不能高出64字节,是为了便于同一分派每个节点的长度;这里的64字节是指字符串的长度,不包罗SDS布局,由于压缩列表行使持续、定长内存块存储字符串,不必要SDS布局指明长度。后头提到压缩列表,也会夸大长度不高出64字节,道理与这里相同。

3、哈希

(1)轮廓

哈希(作为一种数据布局),不只是redis对外提供的5种工具范例的一种(与字符串、列表、荟萃、有序结归并列),也是Redis作为Key-Value数据库所行使的数据布局。为了声名的利便,在本文后头当行使“内层的哈希”时,代表的是redis对外提供的5种工具范例的一种;行使“外层的哈希”代指Redis作为Key-Value数据库所行使的数据布局。

(2)内部编码

内层的哈希行使的内部编码可所以压缩列表(ziplist)和哈希表(hashtable)两种;Redis的外层的哈希则只行使了hashtable。

压缩列表前面已先容。与哈希表对比,压缩列表用于元素个数少、元素长度小的场景;其上风在于齐集存储,节减空间;同时,固然对付元素的操纵伟大度也由O(n)变为了O(1),但因为哈希中元素数目较少,因此操纵的时刻并没有明明劣势。

hashtable:一个hashtable由1个dict布局、2个dictht布局、1个dictEntry指针数组(称为bucket)和多个dictEntry布局构成。

正常环境下(即hashtable没有举办rehash时)各部门相关如下图所示:

下面从底层向上依次先容各个部门:

dictEntry

dictEntry布局用于生涯键值对,布局界说如下:

个中,各个属性的成果如下:

  •  key:键值对中的键; 
  •  val:键值对中的值,行使union(即共用体)实现,存储的内容既也许是一个指向值的指针,也也许是64位整型,或无标记64位整型; 
  •  next:指向下一个dictEntry,用于办理哈希斗嘴题目 

在64位体系中,一个dictEntry工具占24字节(key/val/next各占8字节)。

bucket

(编辑:湖南网)

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

热点阅读