redis系列-跳跃表

跳跃表

什么是跳跃表:

跳跃表是一种有序集合,可以通过在每个节点中维持多个指向其他节点的指针,快速定位到节点所在位置
1.比如我们有一个有序链表集合:1-7,如果我们想找出7的位置,则需要比较7次
在这里插入图片描述
2.如果我们采用跳跃表方式,利用类似索引的方式,提取出关键点,如下图,我们搜索7的位置就会快很多。这样多层链表结构就是我们称为跳跃表
在这里插入图片描述

redis中使用的跳跃表

redis中使用跳跃表作为有序集合键的底层实现,如果一个有序集合包含的元素数量比较多,或者元素成员是长字符串,redis底层就会采用跳跃表来实现

redis跳跃表实现
zskiplistNode

redis跳跃表由zskiplistNode和zskiplist两个结构定义。zskiplistNode表示跳跃表节点,zksiplist结构用于保存跳跃表节点相关信息。

typedef struct zskiplistNode{
	struct zskiplistNode *backward;
	double score;
	robj *obj;
	struct zskiplistLevel{
		struct zskiplistNode *forward;
		unsigned int span
	} level[];
} zskiplistNode;
  • zskiplistLevel :层,表示多个元素,每个元素包含一个指向其他节点的指针,每一层对应跳跃表的每一层
  • struct zskiplistNode 每个层有一个指向下一个节点的前进指针
  • int span:跨度,用于记录两个节点之间的距离,当两个节点跨度越大,那么相距越远
  • backward 指针用于从表尾向表头方向访问节点,当时他一次只能回溯一个节点
  • score:节点的分值,double类型,跳跃表的所有节点按照从小到大排序,分值相同的节点按照熟悉obj成员对象在字典序中的大小进行排序,成员对象较小的节点会排在前面,较大的会排在后面
zskiplist

redis通过zskiplist结构来持有这些节点,可以快速获取跳跃表节点的数量

typedef struct zskiplist{
structz skiplistNode *header,*tail;
unsigned long length;
int level;
} zskiplist
  • header 和tail 指针分别表示指向跳跃表的表头和表尾节点,程序定位表头和表尾的时间复杂的为O(1)
  • length表示该跳跃表节点的数量
  • level 表示该跳跃表中层高最大的那个节点的层数量
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值