跳跃表(skiplist)是一种有序数据结构,它经过在每一个节点中维持多个指向其余节点的指针,从而达到快速访问节点的目的。跳跃表是一种随机化的数据,跳跃表以有序的方式在层次化的链表中保存元素,效率和平衡树媲美 ——查找、删除、添加等操做均可以在对数指望时间下完成,而且比起平衡树来讲,跳跃表的实现要简单直观得多。redis
Redis 只在两个地方用到了跳跃表,一个是实现有序集合键,另一个是在集群节点中用做内部数据结构。数组
typedef struct zskiplistNode{ //节点 //层 struct zskiplistLevel{ struct zskiplistNode *forward; //前进指针 unsigned int span; //跨度 } level[]; struct zskiplistNode *backward; //后退指针 double score; //分值 robj *obj; //成员对象 }
一、层:level 数组能够包含多个元素,每一个元素都包含一个指向其余节点的指针。数据结构
二、前进指针:用于指向表尾方向的前进指针ui
三、跨度:用于记录两个节点之间的距离编码
四、后退指针:用于从表尾向表头方向访问节点spa
五、分值和成员:跳跃表中的全部节点都按分值从小到大排序。成员对象指向一个字符串,这个字符串对象保存着一个SDS值3d
typedef struct zskiplist { //zskiplist 数据结构 structz skiplistNode *header,*tail; //表头节点和表尾节点 unsigned long length; //表中节点数量 int level; //表中层数最大的节点的层数 }zskiplist;
header,tail分别指向跳跃表的头结点和尾节点。level 用于记录最大的层数,length 用于记录咱们的节点数量。指针
===================================================================code
整数集合是集合建的底层实现之一,当一个集合中只包含整数,且这个集合中的元素数量很少时,redis就会使用整数集合intset做为集合的底层实现。对象
typedef struct intset{ uint32_t enconding; //编码方式 uint32_t length; // 集合包含的元素数量 int8_t contents[]; //保存元素的数组 }
intset 在默认状况下会设定整数集合中的编码方式,可是当存入的整数不符合整数集合中的编码格式时,就须要使用到Redis 中的升级策略来解决:
一、根据新元素的类型,扩展整数集合底层数组的空间大小,并为新元素分配空间
二、将底层数组现有的全部元素都转换成新的编码格式,从新分配空间
三、将新元素加入到底层数组中
1.如今须要插入一个32位的整数,这显然与整数集合不符合,将进行编码格式的转换,并为新元素分配空间:
2.将原有数据他们的数据类型转换为与新数据相同的类型:(从新分配空间后的数据)
3.将新数据添加到数组中:
整数集合是集合建的底层实现之一
整数集合的底层实现为数组,这个数组以有序,无重复的范式保存集合元素,在有须要时,程序会根据新添加的元素类型改变这个数组的类型
升级操做为整数集合带来了操做上的灵活性,而且尽量地节约了内存
整数集合只支持升级操做,不支持降级操做
====================================================================
压缩列表是列表键和哈希键的底层实现之一。
一、zlbytes:用于记录整个压缩列表占用的内存字节数
二、zltail:记录要列表尾节点距离压缩列表的起始地址有多少字节
三、zllen:记录了压缩列表包含的节点数量。
四、entryX:要说列表包含的各个节点
五、zlend:用于标记压缩列表的末端
压缩列表是一种为了节约内存而开发的顺序型数据结构
压缩列表被用做列表键和哈希键的底层实现之一
压缩列表能够包含多个节点,每一个节点能够保存一个字节数组或者整数值
添加新节点到压缩列表,可能会引起连锁更新操做。