Redis篇——Zset在Redis中底层存储数据结构,深入浅出详细剖析底层存储逻辑,一篇文章帮你拿下!
在Redis中,Zset(Sorted Set)是一种数据类型,它不仅存储元素,而且还将每个元素关联到一个浮点数的分数。Zset中的成员是唯一的,但分数可以重复。
Redis的Zset底层实现了一个跳跃列表(skiplist),同时为了保证数据结构的正确性,它还引入了一个哈希表。
跳跃列表是一种平衡的数据结构,它通过多级链表的方式来保证数据的有序,每个节点都可能有多个指针指向后续的节点。
哈希表用于确保成员的唯一性,它的作用是在期望的时间内,根据成员查找或者更新相关的分数。
下面是一个简单的示例,描述了Zset在Redis中的存储逻辑:
typedef struct zskiplistNode {
robin_hood::unordered_map::node* ht_node; // 指向哈希表的节点
struct zskiplistNode* backward; // 后退指针
double score; // 分数
robj* obj; // 成员对象指针
struct zskiplistNode* forward; // 前进指针
unsigned int span; // 跳跃范围
} zskiplistNode;
typedef struct zskiplist {
struct zskiplistNode* header, * tail; // 表头和表尾节点
unsigned long length; // 节点的数量
int level; // 最高层数
} zskiplist;
typedef struct zset {
dict* dict; // 哈希表,用于保存成员到分数的映射
zskiplist* zsl; // 跳跃列表,用于保存有序的成员列表
} zset;
在这个结构中,zset包含了一个zskiplist和一个dict。zskiplist用于保存成员按分数排序的列表,而dict用于快速查找成员对应的分数。
当你要添加、删除或者查找元素时,Redis会根据成员在跳跃列表中的位置来更新哈希表,并且可以在对数平均时间内完成操作,保证了操作的高效性。
评论已关闭