前言
之前总是从网上去找跳跃表的实现原理,发现都很难理解,下面我会通过源码和画图分析让你一目了然。
一、skiplist
前面的文章说到了,zset的实现就有skiplist,我们来看一下zset的结构体:
typedef struct zset {
dict *dict; //字典存放value,以value为key
zskiplist *zsl;
} zset;
你是否有疑惑,里面的dict 的作用是什么?
字典里面保存了有序集合中member与score的键值对
跳跃表则用于实现按score排序的功能
zskiplist结构则用于保存跳跃表节点的相关信息,比如节点的数量,以及指向表头节点和表尾节点的指针等等;
zskiplistNode结构用于表示跳跃表的节点:
typedef struct zskiplist {
struct zskiplistNode *header, *tail;
unsigned long length;
int level;
} zskiplist;
typedef struct zskiplistNode {
sds ele;
double score;
struct zskiplistNode *backward;
struct zskiplistLevel {
struct zskiplistNode *forward;
unsigned long span;
} level[];
} zskiplistNode;
创建一个节点:
zskiplist *zslCreate(void) {
int j; zskiplist *zsl;
zsl = zmalloc(sizeof(*zsl));
zsl->level = 1;
zsl->length = 0;
zsl->header = zslCreateNode(ZSKIPLIST_MAXLEVEL,0,NULL);
for (j = 0; j < ZSKIPLIST_MAXLEVEL; j