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:用於標記壓縮列表的末端

壓縮列表是一種爲了節約內存而開發的順序型數據結構

壓縮列表被用做列表鍵和哈希鍵的底層實現之一

壓縮列表能夠包含多個節點,每一個節點能夠保存一個字節數組或者整數值

添加新節點到壓縮列表,可能會引起連鎖更新操做。

相關文章
相關標籤/搜索