ziplist vs常规数组和ziplist中实现redis hash ziplist特征常规数组特征: zip list中hash密钥和值的存储
zipList的特点需要连续的内存地址。 还需要预先分配地址。 可以保存不定长度的数据,但有长度的限制。 从数组的尾部插入不会导致数组偏移。 插入、删除都可能导致数组移位,大量存储器copy的动作是插入、删除的平均时间复杂度为o(n )、最差时间复杂度为o(n )查询效率与通常的数组相同的o(n ) )
ziplist的模型如下图:
entry的结构图如下:
上图中有一点不严密,即没有字符存在,用二进制表示data的内存长度。
通常,在redis数据结构中使用hash、set、zset,是比较灵活、节约内存的数据结构
常见数组特征:需要连续的内存地址,但并不意味着访问是连续的地址。 因为数组可能包含指针,所以他的访问可能涉及其他寻址过程
的数组元素是固定长度,需要从一开始就声明,所以会有东西出现。 我们的数组中可能大多数都有小于100的数字,但由于我们的长度限制问题,数组单位的长度=数组元素的最大长度。
整型数组
引用类型数组(在java 里面一切皆为引用):
hash的key和value在ziplist上的存储首先看到了官方网站的说明:
以redis的hash为例。 首先,redis的hash也是用链地址法实现的。 由于条目是链表的对象,因此对于总entry数量少于512个****且单个entry的key或者value 不超过64个字节,hash使用名为ziplist的数据结构存储。
那么,如何在一个ziplist中表现形式就出现了疑问。key 和value 在ziplist 为两个相临的元素
例如,在redis客户端上运行hset test1 123 456时,内存如下所示:
其他相关参考:
33559 www.Jian Shu.com/p/AFA f78 AAF 615