内存映射数据结构

解决问题:当一个对象包含的元素数量并不多,或者元素本身的体积并不大时,使用代价高昂的内部
数据结构并不是最好的办法。

内存映射数据结构是一系列经过特殊编码的字节序列,创建它们所消耗的内存通常比作用类似
的内部数据结构要少得多,如果使用得当,内存映射数据结构可以为用户节省大量的内存。

整数集合(intset)

用于有序、无重复地保存多个整数值,它会根据元素的值,自动选择该用什么长度的整数类型来保存元素

举例说明:如果在一个intset 里面,最长的元素可以用int16_t 类型来保存,那么这个intset的所有元素都以int16_t 类型来保存。果有一个新元素要加入到这个intset ,并且这个元素不能用int16_t 类型来保存——比如说,新元素的长度为int32_t ,那么这个intset 就会自动进行“升级” :先将集合中现有的所有元素从int16_t 类型转换为int32_t 类型,接着再将新元素加入到集合中。

整数结合的应用

Intset 是集合键的底层实现之一,如果一个集合:
1. 只保存着整数元素;
2. 元素的数量不多;
那么Redis 就会使用intset 来保存集合元素。

 

压缩列表(Ziplist)

Ziplist 是由一系列特殊编码的内存块构成的列表,一个ziplist 可以包含多个节点(entry),每
个节点可以保存一个长度受限的字符数组(不以\0 结尾的char 数组)或者整数,包括:

• 字符数组
– 长度小于等于63 (26 􀀀 1)字节的字符数组
– 长度小于等于16383 (214 􀀀 1)字节的字符数组
– 长度小于等于4294967295 (232 􀀀 1)字节的字符数组
• 整数
– 4 位长,介于0 至12 之间的无符号整数
– 1 字节长,有符号整数
– 3 字节长,有符号整数
– int16_t 类型整数
– int32_t 类型整数
– int64_t 类型整数

 

 posted on 2015-07-08 14:19  lukexwang  阅读(393)  评论(0编辑  收藏  举报