Redis数据结构SortedSet底层原理详解

概述

一些常用命令:

存储:zadd key score value

获取:zrange key start end

获取:同时获取分数:zrange key start end with score

删除:zrem key value

存储的时候我们可以发现,是有一个score(分数)的,这个就是用来排序的字段。

实现

先说结论,SortedSet底层,根据配置会在不同的时候选用两种不同的数据结构zset,或ziplist进行存储:

首先,我们来看几个参数:

zset-max-ziplist-entries 128
zset-max-ziplist-value 64
if (
    field-value对的数量 > ziplist.entries.size ||
    任意一个filed或value长度 > zset-max-ziplist-value
) {
    // 使用 zset 进行存储
} else {
    // 使用 ziplist 进行存储

zset的结构如下:

typedef struct zset {
    dict *dict;
    zskiplist *zsl;
} zset

可以发现,是由字典+跳跃表实现的。

zset 结构体里有两个元素,一个是 dict,用来维护 数据 到 分数 的关系,一个是 zskiplist,用来维护 分数所在链表 的关系

dict 里通过维护 哈希表 存储了 张三=>100,李四=>90 的分数关系。

而跳表则是排序的关键

跳跃表

先上图:
在这里插入图片描述
我们知道,链表的检索效率是非常低的,如果要拿到100条数据中间的数据,则需要遍历50个数据才行,为了解决这个问题,跳表应运而生

如上图,就是常规的跳表,会在原有的数据上加上若干层,指向当前层的下一个节点。

跳表的插入:
在这里插入图片描述
如上图所示:其实每个节点的层数是随机的,而且新插入一个节点不会影响其它节点的层数。因此,插入操作只需要修改插入节点前后的指针,而不需要对很多节点都进行调整。这就降低了插入操作的复杂度。实际上,这是skiplist跳表的一个很重要的特性,这让它在插入性能上明显优于平衡树的方案。

如下图,假如我们需要查询23,查询的路径如下。
在这里插入图片描述
事实上,在插入之前也要先经历一个类似的查找过程,在确定插入位置后,再完成插入操作。
这也是SortedSet实现排序的原理。

压缩列表

压缩列表 ziplist 是为 Redis 节约内存而开发的。

压缩列表是由一系列特殊编码的连续内存块组成的顺序型数据结构,一个压缩列表可以包含任意多个节点 (entry),每个节点可以保存 一个字节数组 或者 一个整数值 。
在这里插入图片描述
1、zl bytes:用于记录整个压缩列表占用的内存字节数

2、zl tail:记录要列表尾节点距离压缩列表的起始地址有多少字节

3、zl len:记录了压缩列表包含的节点数量。

4、entryX:要说列表包含的各个节点

5、zl end:用于标记压缩列表的末端

压缩列表是一种为了节约内存而开发的顺序型数据结构

压缩列表被用作列表键和哈希键的底层实现之一

压缩列表可以包含多个节点,每个节点可以保存一个字节数组或者整数值

添加新节点到压缩列表,可能会引发连锁更新操作。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis数据结构底层原理可以从两个层面来讨论。第一个层面是Redis如何通过组合不同的基础数据结构来实现更高层的数据结构。这个层面主要关注Redis数据结构之间的关系以及如何实现复杂的数据操作。 第二个层面是具体的数据结构的内部实现。每种数据结构都是经过专门设计的,并且有一种或多种数据结构来支持。这些灵活的数据结构Redis能够提供高性能的关键。 要详细了解Redis数据结构底层原理,可以参考张铁磊的博客文章《redisObject数据结构详解》。这篇文章深入地介绍了Redis数据结构的内部实现,包括字符串、列表、哈希表、集合和有序集合等。 总的来说,Redis数据结构底层原理是通过组合不同的基础数据结构来实现更高层的数据结构,并通过专门设计的数据结构来支持高性能的读写操作。详细的内容可以参考所提供的引用资源。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Redis的五种数据结构的底层实现原理](https://blog.csdn.net/a745233700/article/details/113449889)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值