跳跃列表(skipList)、压缩列表(zipList)和快速列表(quicklist)

跳跃列表(skipList)、压缩列表(zipList)和快速列表(quicklist)都是Redis底层重要的数据结构。

跳跃列表(skipList)

Redis使用跳跃表作为有序集合键的底层实现之一,通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的,如果一个有序集合包含的元素数量比较多,
又或者有序集合中元素的成员(member)是比较长的字符串时,Redis就会使用跳跃表来作为有序集合键的底层实现。
Redis只在两个地方用到了跳跃表,
一个是实现有序集合键,另一个是在集群节点中用作内部数据结构,除此之外,跳跃表在Redis里面没有其他用途。

C语言代码实现:

typedef struct zskiplistNode {
	//用于存储字符串类型的数据
    robj *obj;
    //用于存储排序的分值
    double score;
    //回退指针
    struct zskiplistNode *backward;
    struct zskiplistLevel {
    	//前进指针
        struct zskiplistNode *forward;
        //跨度
        unsigned int span;
    } level[];
} zskiplistNode;

压缩列表(zipList)

压缩列表本质上就是一个字节数组,是Redis为了节约内存而设计的一种线性数据结构,可以包含多个元素,每个元素可以是一个字节数组或一个整数。Redis的有序集合、散列和列表都直接或者间接使用了压缩列表。

当有序集合或散列表的元素个数比较少,且元素都是短字符串时,Redis便使用压缩列表作为其底层数据存储结构。当元素数量大于128个,所有元素长度大于64字节时,Redis使用快速链表(quicklist)数据结构存储,而快速链表就是双向链表与压缩列表的组合。

快速列表(quicklist)

快速列表是Redis中List的底层数据结构,它实质上是双向链表与压缩列表的组合,每个节点的实际数据存储结构为ziplist。这种结构的主要优势在于节省存储空间,同时也保证了数据读写性能。

C语言代码实现

typedef struct quicklist{
	quicklistNode *head;
	quicklistNode *tail;
	unsigned long count;//快速列表中元素总数
	unsigned long len;//快速列表中Node(节点)个数
	int fill : 16;//每个quicklistNode中ziplist长度
}quicklist;

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值