【Redis】拼多多面试官问我zset底层是如何实现的,我反手就把跳表的数据结构画了出来

本文详细介绍了Redis中的有序集合(zset)及其内部数据结构,包括ziplist和skiplist编码。skiplist是一种高效的查找数据结构,通过多层链表实现近似O(logn)的查找复杂度。文章阐述了skiplist的随机生成层数策略,以及其在插入、删除操作上的优势,同时对比了skiplist与哈希表和平衡树在范围查找、插入删除性能及内存占用上的差异。

我是少侠露飞。学习塑造人生,技术改变世界。与诸君共勉!

引言

Redis因为其完全基于内存、性能出色,加上具备丰富的数据类型,在电商环境中深受后端开发的喜爱。其中有序集合zset就是基本数据类型之一,并且每个member都带有score(可用于排序),因此很适合在打赏日榜、近一周收益这类场景中运用。

数据结构初探

有序集合对象的编码可以是ziplist或者skiplist。同时满足以下条件时使用ziplist编码:

  • 元素数量小于128个

  • 所有member的长度都小于64字节

以上两个条件的上限值可通过zset-max-ziplist-entries和zset-max-ziplist-value来修改。

ziplist编码的有序集合使用紧挨在一起的压缩列表节点来保存,第一个节点保存member,第二个保存score。ziplist内的集合元素按score从小到大排序,score较小的排在表头位置。

skiplist编码的有序集合底层是一个命名为zset的结构体,而一个zset结构同时包含一个字典和一个跳跃表。跳跃表按score从小到大保存所有集合元素。而字典则保存着从member到score的映射,这样就可以用O(1)的复杂度来查找member对应的score值。虽然同时使用两种结构,但它们会通过指针来共享相同元素的member和score,因此不会浪费额外的内存。

深入跳表skiplist

在介绍跳表前,我们先来回顾一下基本链表,并思考为何一步一步演化成跳表的数据结构。

在这里插入图片描述

在这样一个链表中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值