1. 跳躍表是有序集合(zset)的底層實現之一;
2. 由zskiplist和zskiplistNode組成;
3. 每個跳躍表節點的層數都是1-32之間的隨機數(每創建一個節點的時候,程序會隨機生成一個數[1-32]作為level數組的大小);
4. 同一個跳躍表中,多個節點可以包含相同的分值,但節點的成員對象是唯一的;
5. 按分值排序,若分值相同就按成員對象大小排序。
zskiplist數據結構
typedef struct zskiplist { //頭節點和尾節點 struct zskiplistNode *header, *tail; //節點數量 unsigned long length; //表中節點最大層數 int level; } zskiplist;
zskiplistNode 數據結構
typedef struct zskiplistNode { //層 struct zskiplistLevel { //前進指針 struct zskiplistNode *forward; //跨度 unsigned int span; } level []; //后退指針 struct zskiplistNode *backward; //分值 double score; //成員對象 robj *obj; } zskiplistNode;
1. 前進指針(leve[i].forward)用於表頭向表尾方向訪問節點。
2. 跨度(level[i].span)記錄兩個節點之間的關系。
3. 后退指針(backward)用於表尾向表頭方向訪問節點,每次只能后退一個節點。
4. 分值(score),表中的節點按分值大小排序。
5. 成員對象(obj)是一個指針,指向一個SDS對象。