redis zset实现

Redis中的有序集合zset通过跳跃表(skiplist)或压缩链表(ziplist)来实现。当元素数量少于128且每个元素小于64字节时使用ziplist,否则使用skiplist。skiplist结合map提供O(1)的查找速度,按分数排序并存储[score,value]对,其查询、插入、删除操作具有O(logN)的时间复杂度。跳跃表优于红黑树的选择在于实现更简洁。
摘要由CSDN通过智能技术生成

redis跳表——zset的底层实现
redis中有序集合的实现采用了一种数据结构——跳跃表。跳跃表是有序单链表的一种改进,其查询、插入、删除也是O(logN)的时间复杂度。

zset的两种实现方式

  • ziplist(压缩链表):满足以下两个条件的时候

    • 元素数量少于128的时候
    • 每个元素的长度小于64字节
  • skiplist(跳跃链表):不满足上述两个条件就会使用跳表,具体来说是组合了map和skiplist

    • map用来存储member到score的映射,这样就可以在O(1)时间内找到member对应的分数
    • skiplist按从小到大的顺序存储分数
    • skiplist每个元素的值都是[score,value]对

skiplist原理

在这里插入图片描述
上图用a,b,c,d,e五种有序链表说明了跳跃表的motivation.

  1. [a]单链表:查询时间复杂度O(n)7
  2. [b]level-2单链表:每隔一个节点为一个level-2节点,每个level-2节点有2个后继指针,分别指向单链表中的下一个节点和下一个level-2节点。查询时间复杂度为O(n/2)
  3. [c]level-3单链表:每隔一个节点为一个level-2节点,每隔4个节点为一个level-3节点,查询时间复杂度O(n/4)
  4. [d]指数式单链表:每隔一个节点为一个level-2节点,每隔4个节点为一个level-3节点,每隔8个节点为一个level-4节点(每2^i个节点的level为i+1),查询时间复杂度为O(log2N)
  5. [e]跳跃表:各个level的节点个数同指数式单链表,但出现的位置随机,查询复杂度是O(logN)

redis选择跳跃表而非红黑树作为有序集合实现方式的原因并非是基于并发上的考虑,因为redis是单线程的,选用跳跃表的原因仅仅是因为跳跃表的实现相较于红黑树更加简洁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值