跳跃表由 zskiplistNode 和 zskiplist 两个结构定义.
其中 zskiplistNode 表示跳跃表的各个节点,节点下有 zskiplistLevel 记录每个节点的各个层.
层中有两个字段,一个是前进指针,一个是本帖主题‘跨度’.
按《 Redis 设计与实现》书中所写,层的跨度用于记录两个节点之间的距离,实际作用是用来计算节点的排位,在查找某个节点的过程中,将沿途访问过的所有层的跨度累计起来,得到的结果就是目标节点在跳跃表中的排位.
跳跃表按我的理解就是一个维护了多层索引的链表,那么可以通过维护一个下标索引直接计算节点间的距离,也可以直接使用下标索引得到当前节点的排位,那么每个节点的各个层都维护一个跨度的意义在哪里呢…?添加删除的时候更加麻烦,还占用了更多的内存空间.
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.