Redis数据结构之跳跃表

雨点打透心脏的1/2处 2022-05-13 12:44 238阅读 0赞

在Redis5大数据结构中,跳跃表(skiplist)是比较难理解的,同时却也是使用比较少的数据结构,只在实现有序集合zset和集群节点内部槽位和键的对饮关系数据结构中用到了。

数据结构代码

  1. typedef struct zskiplist{
  2. struct zskiplistNode *header, *tail;//指定头节点和尾节点
  3. unsigned long length;//集合长度
  4. int level//跳跃表最大深度,即以节点中层数最多的那个为准,头节点不包括在内
  5. }zskiplist

跳跃表单节点数据结构

  1. typedef struct zskiplistNode{
  2. struct zskiplistNode *backward//后退指针
  3. double score//分值
  4. robj *obj//成员对象
  5. struct zskiplistLevel{
  6. //层对象
  7. struct zskiplistNode *forward;//前进指针
  8. unsigned int span;//两个节点之间的距离跨度,主要用于获取当前节点排位
  9. }level[];
  10. }zskiplistNode;

头节点的后退指针和成员对象、分值都不会被使用到。尾节点的前进指针都为null。
跳跃表每创建一个节点的时候,都会根据幂次定律随机生成一个介于1~32的数值作为该节点的层数,即zskiplistLevel数组的长度。也就是说跳跃表的最大深度为32。一般来说,层数越多,则从该节点访问其他节点的速度会越快。

当跳跃表用于表示集群中槽位和键的关系的时候,score为槽位号(score可重复,节点按键排序),成员是数据库键。通过遍历跳跃表可以很轻易的统计某个槽位中所有键及其个数。

发表评论

表情:
评论列表 (有 0 条评论,238人围观)

还没有评论,来说两句吧...

相关阅读

    相关 redis 跳跃

    跳跃表 跳跃表是有序集合的底层实现之一, 除此之外它在 Redis 中没有其他应用。 Redis 的跳跃表实现由 zskiplist 和 zskiplistN