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

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

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

bucket是一个数组,数组的每个元素都是指向dictEntry布局的指针。redis中bucket数组的巨细计较法则如下:大于dictEntry的、最小的2^n;譬喻,假若有1000个dictEntry,那么bucket巨细为1024;假若有1500个dictEntry,则bucket巨细为2048。

dictht

dictht布局如下:

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

  •  table属性是一个指针,指向bucket; 
  •  size属性记录了哈希表的巨细,即bucket的巨细; 
  •  used记录了已行使的dictEntry的数目; 
  •  sizemask属性的值老是为size-1,这个属性和哈希值一路抉择一个键在table中存储的位置。 

dict

一样平常来说,通过行使dictht和dictEntry布局,便可以实现平凡哈希表的成果;可是Redis的实现中,在dictht布局的上层,尚有一个dict布局。下面声名dict布局的界说及浸染。

dict布局如下:

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

个中,type属性和privdata属性是为了顺应差异范例的键值对,用于建设多态字典。

ht属性和trehashidx属性则用于rehash,即当哈希表必要扩展或紧缩时行使。ht是一个包括两个项的数组,每项都指向一个dictht布局,这也是Redis的哈希会有1个dict、2个dictht布局的缘故起因。凡是环境下,全部的数据都是存在放dict的ht[0]中,ht[1]只在rehash的时辰行使。dict举办rehash操纵的时辰,将ht[0]中的全部数据rehash到ht[1]中。然后将ht[1]赋值给ht[0],并清空ht[1]。

因此,Redis中的哈希之以是在dictht和dictEntry布局之外尚有一个dict布局,一方面是为了顺应差异范例的键值对,另一方面是为了rehash。

(3)编码转换

如前所述,Redis中内层的哈希既也许行使哈希表,也也许行使压缩列表。

只有同时满意下面两个前提时,才会行使压缩列表:哈希中元素数目小于512个;哈希中全部键值对的键和值字符串长度都小于64字节。假若有一个前提不满意,则行使哈希表;且编码只也许由压缩列表转化为哈希表,反偏向则不行能。

下图展示了Redis内层的哈希编码转换的特点:

4、荟萃

(1)轮廓

荟萃(set)与列表相同,都是用来生涯多个字符串,但荟萃与列表有两点差异:荟萃中的元素是无序的,因此不能通过索引来操纵元素;荟萃中的元素不能有一再。

一个荟萃中最多可以存储2^32-1个元素;除了支持通例的增编削查,Redis还支持多个荟萃取交集、并集、差集。

(2)内部编码

荟萃的内部编码可所以整数荟萃(intset)或哈希表(hashtable)。

哈希表前面已经讲过,这里略过不提;必要留意的是,荟萃在行使哈希表时,值所有被置为null。

整数荟萃的布局界说如下:

个中,encoding代表contents中存储内容的范例,固然contents(存储荟萃中的元素)是int8_t范例,但现实上其存储的值是int16_t、int32_t或int64_t,详细的范例即是由encoding抉择的;length暗示元素个数。

(编辑:湖南网)

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

热点阅读