上图所示跳跃列表存储示意图
每一个节点就是上图所示的每一列。可以看到每一列的高度不一样,这正是跳跃列表的不同之处。
每个节点存储的数据是kv结构,分别存储了数据value和对应的分数score。节点的高度是该节点的层级属性。通过随机算法,节点在创建时会被设置成相应的层级level高度。图中只演示了4层,但其实redis中的跳跃列表的最大层级并不止此所示。
列表中的数据按score从小到大,依次从左往右排列。若此时需要获取指定分数节点,即上图红标所指。
查找示例
如下:
- 跳跃列表从head头节点的最高层level开始,此时为level4,查找level4箭头所指下一节点,即找到节点7。
- 查询节点7score大于目标score。则往下level查找。即head节点此时查找level3对应下一节点,即找到节点2。
- 查询节点2score小于目标score。则从节点2的level3箭头查找下一节点。同样找到节点7。再次判断大于目标score。
- 节点2往下降低level。到level2箭头所指下一节点,找到节点5。
- 查询节点5score小于目标score。则从节点5的level2开始查找。同样检验节点7。
- 节点5往下降低level。到level1箭头所指下一节点。找到节点6。
- 此时找到目标节点。通过查询路径上的rank相加得到当前节点rank为2+3+1=6。
更新示例
- 新建节点
- 查询插入位置
- 插入节点,更新向后向前节点指针