Redis zskiplist

Redis 跳表 zskiplist

1. 用途

  • 用于实现Redis中的有序集合
  • 用于在一个集群节点中用于内部数据结构

2. 数据定义

2.1 zskiplist (redis.h/zskiplist)
typedef struct zskiplist{
struct skiplistNode*header,tail;
unsigned long length;
int level;
}zskiplist;
  • head,tail skiplistNode 指针用于指向调表中的头节点和尾节点
  • length 当前跳跃表的长度 也就是包含的节点数量 头节点不包含在内
  • level 当前所有节点中的最高层级 头节点不包含在内
2.2 zskiplistNode (redis.h/zskiplistNode)
typedef struct zskiplistNode
{
struct zskiplistNode*backward;
double score'
robj*obj;
struct zskipLevel{
	struct zskiplistNode*forward;
	unsigned int span;
}level[];
}zskiplistNode;
  • backward 后退指针 用于从尾部节点向头节点遍历 并且只能一个个的节点进行遍历 遇到NULL就结束
  • score double类型用于保存分数
  • obj 指针指向一个SDS(简单动态数组) 保存节点的键
  • level[n].forward 某个层级的前进指针
  • level[n].span 某个层级的跨度 用于记录当前节点与下一个节点之间的距离,跨度与遍历的操作无关对于遍历只能一个个节点的往后进行,跨度是用来计算排位的,在访问某个节点的过程中 将沿途访问过的所有层的跨度加起来就会得到排位
2.4 具体说明

zskiplist

  • level = 5 是计算的所有节点的最高层级数 也就是节点三的层级数 表头节点不包括在内
  • span 表示当前节点与下一个同层级节点的距离
  • 对于跳表来说访问头尾节点的时间复制度是O(1)
  • 对于获取调表的长度来说时间复杂度也是O(1)
  • 对于节点的查找 插入和删除等操作的时间复杂度 平均是O(lgn) 最坏是O(n)

3. API

函数作用
zslCreate创建一个新的跳跃表
zslFree释放一个跳表以及当中的所有节点
zslInsert添加新的节点到跳表
zslDelete删除指定的跳表节点
zslGetRank返回包含指定节点在表中的排位
zslGetElementByRank返回指定排位的所指向的节点
zslIsInRange给定一个分值范围 ,如果给定的范围在跳表的分值范围内返回1 否则返回0
zslFirstInRange给定一个分值范围 给出第一个符合这个范围的节点
zslLastInRange给定一个分值范围 返回最后一个符合这个范围的节点
zslDeleteRangeByScore给定一个分值范围 删除表中所有符合这个范围内的节点
zslDeleteRangeByRank给定一个排位的范围 删除表中在这个范围内的节点
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值