Redis跳表揭秘第一个节点(redis跳表第一个节点)
Redis跳表是一种空间换时间的数据查找结构,它是一种改进的二叉树结构,可以按照数字进行排序查找,时间复杂度为 O(logN)。跳表包含一系列的双向列表,其中的每个节点都包含元素的值,以及不同层级的指针。跳表将普通的hash表进行了多层次抽象,在此基础上实现了各种功能,如查找插入和删除操作等,操作时间复杂度可以由O(n)降到O(log n),性能提升众多。
我们先来弄清楚 Redis 跳表是怎么由一般 Hash 表演变而来。Redis 跳表步兵是作为一个替代哈希表的数据结构设计的。在哈希表中,插入、查找和删除操作的时间复杂度为 O(1) 。但是当数据量大的时候,哈希表的缺陷显而易见:它的存储效率低,并且极易出现冲突,扩容也很困难。
于是,跳表作为一种改进的数据结构,被设计出来。Redis 跳表的结构如下:
![ img ](https://user-gold-cdn.xitu.io/2018/10/24/166b9cf504f9a02f?imageView2/0/w/1280/h/960/format/webp/ignore-error/1)
Redis 跳表包含一系列由双向列表组成的节点,每个节点中都存储有数据,以及不同层次的指针。它的索引指针有前进指针和后进指针,专为提高搜索速度而设置。这里面第一个节点head,它不仅仅包含他自身的数据,更确保了整个链表的连续性和可复用性,每一层具有不同的跳指针,来使整个跳表的搜索效率更加提高。
head结点只是Redis跳表中的第一个节点,Redis 跳表中另一个重要的节点就是tl节点,tl节点扮演着最后一个元素,它能够使我们可以在O(1)的时间复杂度获取最后一个元素,使得链表的末尾可以支持快速操作。
需要说的是Redis跳表的代码实现。下面的代码展示了如何创建Redis跳表的第一个节点。
typedef struct Node {
//节点中存放的数据,可以用来存放任意类型的数据 void *data;
//表示索引的层数,也就是索引的高度 int level;
//节点中每一层的跳转指针 struct Node *forward[];
}rnode;
rnode *head;
//初始化head结点head = (rnode *)malloc(sizeof(rnode)+MAX_LEVEL*sizeof(rnode *));
head->level = MAX_LEVEL;
for (i = 0; i head->forward[i] = NULL;
}
Redis跳表的第一个节点head是整个Redis跳表的根节点,它是所有节点的中心。它的主要作用时保证跳表的整体连续性,提高查询的效率,进而提升Redis性能。
相关文章