使用跳跃列表的原因
Redis中的Zset其实就是一种可排序的,无重复的链表结构,对于Redis这种效率至上的数据库,当然不能容忍时间复杂度过高这种事情的发生。因为Zset可能会进行频繁的增删改查以及排序的工作,数组的低速添加删除自然无法满足需求,所以要使用链表结构,但是Zset的需求是有序,所以在插入元素的时候,要找到对应的位置,可是如果遍历链表的话,时间复杂度过大,二分查找是一种不错的解决方案,但是二分查找只能通过数组索引快速定位来实现,而我们之前的需求只能通过列表来实现,正是因为有这些矛盾,所以我们只能采取一种改良的链表,即跳跃列表。
跳跃列表的构成
跳跃列表是一种类似层级制的链表形式,比如说一个大公司,公司里分为很多的部门,部门又分为很多的团队,团队里又分为很多的小组,小组还分为不同的小队,在这些各个区域都有属于这个地方的主管,你先来公司问公司的老大,我应该去哪,他告诉你你应该去A部门,然后你又去找A部门的老大问,我应该去哪,他告诉你应该去B团队,你又找到B团队的老大问,我应该去哪,B团队的老大告诉你去C小组,你又去找C小组的老大,他告诉你去D队,经过这么几步,你就可以从一个好几万人的大公司,找到了属于你的位置,跳表的结构也是如此。找到对应位置的关键自然是主管了,所以跳表也有主管,不同层级有不同的主管,以便新来的元素插入到该插入的位置之中,随着元素的不断增加,主管人员当然也会不断的增多,首先每一个元素都是最底层的元素,兼职到倒数第二层的概率为50%,倒数第三层的概率为25%,层级越高概率越小,就像是工作晋升一样,一万个人只能有一个是总裁,但是可能有1000个是小组组长,通过这种策略,可以极大的提高元素插入的速度,寻找的速度也会提高。