Redis数据类型底层专题(2)

四,跳跃表

Redis 只在两个地方用到了跳跃表,一个是实现有序集合键(sorted Sets),另外一个是在集群节点中用作内部数据结构。

其实跳表主要是来替代平衡二叉树的,比起平衡树来说,跳表的实现要简单直观的多。

跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速查找访问节点的目的。跳跃表是一种随机化的数据,跳跃表以有序的方式在层次化的链表中保存元素,效率和平衡树媲美 ——查找、删除、添加等操作都可以在O(logn)期望时间下完成。

Redis 的跳跃表 主要由两部分组成:zskiplist(链表)和zskiplistNode (节点):

typedef struct zskiplistNode{

//层

struct zskiplistLevel{

//前进指针

struct zskiplistNode *forward;

//跨度

unsigned int span;

} level[];

//后退指针

struct zskiplistNode *backward;

//分值

double score;

//成员对象

robj *obj;

}

1、层:level 数组可以包含多个元素,每个元素都包含一个指向其他节点的指针。level数组的每个元素都包含:前进指针:用于指向表尾方向的前进指针,跨度:用于记录两个节点之间的距离

2、后退指针:用于从表尾向表头方向访问节点

3、分值和成员:跳跃表中的所有节点都按分值从小到大排序(按照这个进行排序的,也就是平衡二叉树(搜索树的)的节点大小)。成员对象指向一个字符串,这个字符串对象保存着一个SDS值(实际存储的值)

typedef struct zskiplist {

//表头节点和表尾节点

structz skiplistNode *header,*tail;

//表中节点数量

unsigned long length;

//表中层数最大的节点的层数

int level;

}zskiplist;

 

header,tail分别指向跳跃表的头结点和尾节点。level 用于记录最大的层数,length 用于记录我们的节点数量。

跳跃表是有序集合的底层实现之一

主要有zskiplist 和zskiplistNode两个结构组成

每个跳跃表节点的层高都是1至32之间的随机数

在同一个跳跃表中,多个节点可以包含相同的分值,但每个节点的对象必须是唯一的

节点按照分值的大小从大到小排序,如果分值相同,则按成员对象大小排序

五,整数集合(Intset)

《Redis 设计与实现》 中这样定义整数集合:“整数集合是集合建(sets)的底层实现之一,当一个集合中只包含整数,且这个集合中的元素数量不多时,redis就会使用整数集合intset作为集合的底层实现。

我们可以这样理解整数集合,他其实就是一个特殊的集合,里面存储的数据只能够是整数,并且数据量不能过大。

typedef struct intset{

//编码方式

uint32_t enconding;

// 集合包含的元素数量

uint32_t length;

//保存元素的数组

int8_t contents[];

}

整数集合是集合建的底层实现之一.

整数集合的底层实现为数组,这个数组以有序,无重复的范式保存集合元素,在有需要时,程序会根据新添加的元素类型改变这个数组的类型.

 六,压缩列表

压缩列表是列表键(list)和哈希键(hash)的底层实现之一。当一个列表键只有少量列表项,并且每个列表项要么就是小整数,要么就是长度比较短的字符串,那么Redis 就会使用压缩列表来做列表键的底层实现。

1、zlbytes:用于记录整个压缩列表占用的内存字节数

2、zltail:记录要列表尾节点距离压缩列表的起始地址有多少字节

3、zllen:记录了压缩列表包含的节点数量。

4、entryX:要说列表包含的各个节点

5、zlend:用于标记压缩列表的末端

压缩列表是一种为了节约内存而开发的顺序型数据结构

压缩列表被用作列表键和哈希键的底层实现之一

压缩列表可以包含多个节点,每个节点可以保存一个字节数组或者整数值

添加新节点到压缩列表,可能会引发连锁更新操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nathaniel333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值