redis 数据结构2

跳跃表

跳跃表(skiplist)是一种有序数据结构,它经过在每一个节点中维持多个指向其余节点的指针,从而达到快速访问节点的目的。跳跃表是一种随机化的数据,跳跃表以有序的方式在层次化的链表中保存元素,效率和平衡树媲美 ——查找、删除、添加等操做均可以在对数指望时间下完成,而且比起平衡树来讲,跳跃表的实现要简单直观得多。redis

Redis 只在两个地方用到了跳跃表,一个是实现有序集合键,另一个是在集群节点中用做内部数据结构数组

Redis 的跳跃表 主要由两部分组成:zskiplist(链表)和zskiplistNode(节点)

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 用于记录咱们的节点数量。指针

  • 跳跃表是有序集合的底层实现之一
  • 主要有zskiplist 和zskiplistNode两个结构组成
  •  每一个跳跃表节点的层高都是1至32之间的随机数
  • 在同一个跳跃表中,多个节点能够包含相同的分值,但每一个节点的对象必须是惟一的
  • 节点按照分值的大小从大到小排序,若是分值相同,则按成员对象大小排序

===================================================================code

整数集合(Intset)

整数集合是集合建的底层实现之一,当一个集合中只包含整数,且这个集合中的元素数量很少时,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:用于标记压缩列表的末端

压缩列表是一种为了节约内存而开发的顺序型数据结构

压缩列表被用做列表键和哈希键的底层实现之一

压缩列表能够包含多个节点,每一个节点能够保存一个字节数组或者整数值

添加新节点到压缩列表,可能会引起连锁更新操做。

相关文章
相关标签/搜索