redis的zset的底层实现_Redis ZSet底层实现以及ZSet实现延时队列

将知识从定义、来源、实现、问题、优化、应用方面来系统性的回答

Zset原理

有序集合对象是有序的。与列表使用索引下标作为排序依据不同,有序集合为每个元素设置一个分数(score)作为排序依据

ZSet底层如何实现

一、使用ziplist。

前提:保存元素数量小于128,并且每个元素长度小于64字节

(这两个参数可以通过zset-max-ziplist-entries 选项和 zset-max-ziplist-value 进行修改)

ziplist原理:

压缩列表(ziplist)是Redis为了节省内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构,一个压缩列表可以包含任意多个节点(entry),每个节点可以保存一个字节数组或者一个整数值。

image

image

每个节点组成如图。previous_entry_length保存前一个节点的长度,遍历时可根据定位到前一个节点。encoding存储content的类型和长度。content保存节点的内容

二、使用字典和跳跃表

typedef struct zset{

//跳跃表

zskiplist *zsl;

//字典

dict *dice;

} zset;

字典的键保存元素的值,字典的值则保存元素的分值;跳跃表节点的 object 属性保存元素的值,跳跃表节点的 score 属性保存元素的分值。

为什么不直接用跳跃表

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值