深入相识一下Redis的内存模子!
bucket是一个数组,数组的每个元素都是指向dictEntry布局的指针。redis中bucket数组的巨细计较法则如下:大于dictEntry的、最小的2^n;譬喻,假若有1000个dictEntry,那么bucket巨细为1024;假若有1500个dictEntry,则bucket巨细为2048。 dictht dictht布局如下: 个中,各个属性的成果声名如下:
dict 一样平常来说,通过行使dictht和dictEntry布局,便可以实现平凡哈希表的成果;可是Redis的实现中,在dictht布局的上层,尚有一个dict布局。下面声名dict布局的界说及浸染。 dict布局如下: 个中,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暗示元素个数。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |