skiplist简介跳表(skiplist)是一种有序的数据结构,在每个节点中维护不同层级后续节点的指针,以达到快速访问指定节点的目的.跳表搜索指定节点时,平均时间复杂度为,最差时间复杂度为O(N)。Redis使用跳表(skiplist)作为有序集(zset)的底层实现之一。当有序集合中的元素个数大于等于zset-max-ziplist-entries(默认为128),或者每个元素成员的长度大于等于zset-max-ziplist-value(默认为是64字节),使用跳表和哈希表的排序集的内部实现。例如,我们使用zadd命令创建一个有序集作为跳表实现:127.0.0.1:6379>zaddone-more-zset1long-long-long-long-long-long-long-long-long-long-long-long-long(整数)1127.0.0.1:6379>zrangeone-more-zset0-11)“long-long-long-long-long-long-long-long-long-long-long-long-long-long-long"127.0.0.1:6379>objectencodingone-more-zset"skiplist"跳跃列表的实现Redis中的跳跃列表用zskiplist结构表示,其中包含多个跳跃列表节点A形成双向链表,每个跳表节点保存元素成员和对应的分钟数。让我们一一仔细看看。zskiplist结构跳表用zskiplist结构表示,它包含以下属性:header属性:指向跳转表头节点的指针。tail属性:指向尾跳表节点的指针。level属性:表示跳表中层数最多的节点的层数,头节点的层数不计算在内。length属性:表示跳表的节点总数。跳表节点的结构跳表节点用zskiplistNode结构表示,包含如下属性:level属性:表示层的数组,数组中的每一项用zskiplistLevel结构表示,包含如下两个属性:forward属性:指向链表尾部方向上其他节点的指针。span属性:从当前节点到forward指向的节点跨越了多少个节点。backward属性:指向当前节点的前一个节点的指针。obj属性:指向元素成员的指针。score属性:当前元素成员对应的分数。图形跳表说了这么多,但是比较抽象,比较难理解。举个例子:这是一个跳表的内部结构,有4个元素,key分别是:Wan、Mao、Xue、She。为什么不使用平衡树?跳转表将元素有序地存储在分层链表中。在大多数情况下,跳转列表的效率与平衡树相当。查找、删除、添加等操作都可以在对数期望时间内完成,而且相对于平衡树,跳表的实现要简单直观得多。所以在Redis中没有使用平衡树,而是使用了跳表。最后,谢谢你这么帅,给我点赞和关注。
