- Redis版本:5.0.5
- 文件: t_zset.c server.h
张老师讲解redis中跳跃表的概念
跳跃表的实现C++
本篇文章则针对源码来进行分析
跳跃表(zskiplist zsiplistnode)概念
- 跳跃表是一种有序数据结构,它通过在每个节点中维持多个指向其它节点的指针,从而达到快速访问的目的。
- 跳跃表平均支持O(logN)、最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批处理节点。
Redis何时使用跳跃表? - Redis使用跳跃表作为有序集合键的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员是比较长的字符串时,Redis就会使用跳跃表来作为有序集合键的底层实现。
跳跃表的结构
typedef struct zskiplistNode {
sds ele; //sds字符串
double score; //分值
struct zskiplistNode *backward; //后退指针,只在第1层有
//level
struct zskiplistLevel {
struct zskiplistNode *forward; //前向指针
unsigned long span; //跨度
} level[]; //柔性数组
} zskiplistNode;
typedef struct zskiplist {
struct zskiplistNode *header, *tail; //跳表的头指针和尾指针
unsigned long length; //元素总数
int level; //层级
} zskiplist;
解析创建插入查找删除函数(在代码中用注释详细解析)
1.创建函数
zskiplistNode *zslCreateNode(int level, double score, sds ele) {
//分配内存
zskiplistNode *zn =
zmalloc(sizeof(*zn)+level*sizeof(struct zskiplistLevel));
zn->score = score;
zn->ele = ele;
return zn;
}
/* Create a new skiplist. */
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++) {
zsl->header->level[j].forward = NULL;
zsl->header->level[j].span = 0;
}
zsl->header->backward = NU