跳跃表是一种有序的数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。
跳跃表支持**平均O(logN)、最坏O(N)**复杂度的节点查找,还可以通过顺序性操作来批量处理节点。
这里先插个眼,友友们可以先去看这篇博客:https://blog.csdn.net/wuhuayangs/article/details/121908774
(讲得非常好,很好理解)
跳跃表结构:
typedef struct zskiplist {
struct zskiplistNode *header,*tail; // 头尾节点
unsigned long length; // 表中节点数量
int level; // 表中最大的节点层数
}
跳跃表节点:
typedef struct zskiplistNode {
struct zskiplistNode *backward; // 后退指针
double score; // 分值
robj *obj; // 成员对象
struct zskiplistLevel {
struct zskiplistNode *forward; // 前进指针
unsigned int span; // 跨度
} level[];
}
这里贴一幅图:
相信看过那篇博客的你一定能够明白跳跃表运行的底层机制了。
Redis使用跳跃表作为有序集合(Zsorted)的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员是比较长的字符串时,Redis就会使用跳跃表作为有序集合的底层实现。
2024.10.21
writeBy kaiven