将知识从定义、来源、实现、问题、优化、应用方面来系统性的回答
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 属性保存元素的分值。
为什么不直接用跳跃表