redis底层数据结构之跳跃表

redis底层数据结构之跳跃表

redis 的zset有序连表为啥选择用跳跃表?

我们要思考一问题,首先多问问自己为什么,才容易理解它,ps:这是个人观点。首先我们选择的数据结构和算法原因有以下几种:

  • 是否能满足redis的当前需求?
    redis的zset是一个有序链表,而跳跃表很明显满足这个需求。
  • 是否实现起来比较难?
    对于其他有序链表的实现,跳跃表的算法相对简单(对于也是有序结构二叉树而然)
  • 算法的效率可接受?
    跳越表的插入,查询,删除效率都是log(n)
  • 对比一下其他可以替代方案,跳跃表的优点的是啥?
    我们看看百度百科的分析,跳表是一个随机化的数据结构,可以被看做二叉树的一个变种,它在性能上和红黑树,AVL树不相上下,但是跳表的原理非常简单。而且跳跃是一种随机平衡操作,不需要像平衡二叉树那样大量的左旋和右旋保持二叉树的平衡计算,这样插入和删除相对二叉树较高。但是相对平衡二叉树而然,如何随机话算法不好,算法时间复杂直接退化为0(n)

redis的实现:

我们下面具体分析一下zset提供的操作,再根据操作反向推理出其大概数据结构和实现原理(个人认为这样相对容易理解)。

zset支持的操作命令分析:
新增命令

zadd key score member [score member…]
在这里插入图片描述
key:链表的名字
score:分数,排序的权重值,redis按照这个值来排序的
member:成员,相当于value

查询命令
zrange key start stop [WITHSCORES]
在这里插入图片描述
redis的zrange命令可以按照下标查询,可以看到返回的结果按照 score的大小顺序排序。可推理:

  • 有属性存放score,redis会使用score排序。

  • 有属性存放value(“test5”,“test10”,“test20”)

  • 使用范围查询必须要要找到开始位置,这个位置查询需要遍历链表?

    我们看看redis的c的结构体,在<server.h>中,如下

在这里插入图片描述
如上图是redis的真实源码的结构,在结构体zskiplistNode中,包含属性score。很显然,推理是正确的。我们先不要关心redis的其他属性,后面会分析。
首先我们先简单了解一下什么是跳表。
假如我们有以下排序数字:
3,7,9,20,26,30,41,52,60.
如果是用链表存放的话,我们查找一个数字30,就需要遍历整个链表逐个比较,总共需要6次。但是人是比较聪明,不可能一个遍历。那么我们可以做什么呢?见建立目录,每间隔一个,以自身的值建立目录。如下就是一个理想目录表,一共建立二级目录。这就是调表的由来。
在这里插入图片描述

但是建立调表,我们要找,如上图,我们需要把开始节点3记录起来(不然真没法找),所以可以解释以下结构 zskiplist的header就是开始头节点了。
在这里插入图片描述
细心的同学会发现,怎么多出个
tail(见名思义,是尾节点)。
我们在看看redis提供的操作
zrevrange key start stop [WITHSCORES]
作用:返回有序集 key 中,指定区间内的成员。
其中成员的位置按 score 值递减(从大到小)来排列
这就不难推理了,逆序排序,我们知道调表是从小到大排序,逆序就是需要发过来从尾开始找。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis一个开源的内存数据库,它使用了多种数据结构来存储不同类型的数据。下面是几种常见的Redis底层数据结构的详解: 1. 字符串(String):字符串是Redis中最基本的数据结构。它可以存储任意类型的数据,包括数字、文本等。字符串在Redis中以字节数组的形式存储,可以通过键访问和修改。 2. 列表(List):列表是一个有序的字符串集合,可以在列表的两端进行插入、删除和获取操作。Redis使用双向链表来实现列表数据结构,它支持快速插入和删除操作。 3. 哈希(Hash):哈希是一种键值对的集合。在Redis中,哈希可以存储多个字段和对应的值,类似于关联数组或者字典。哈希在内部使用哈希表来实现,可以快速查找和修改字段值。 4. 集合(Set):集合是一组唯一且无序的字符串集合。Redis使用哈希表来实现集合数据结构,它支持添加、删除和判断元素是否存在等操作。 5. 有序集合(Sorted Set):有序集合是一组唯一且有序的字符串集合。在Redis中,每个元素都会关联一个分数,通过分数可以对元素进行排序。有序集合的实现使用了跳跃表和哈希表两种数据结构,它支持添加、删除、修改和范围查询等操作。 这些数据结构底层实现都是高效的,并且支持丰富的操作。Redis数据结构灵活性较高,能够满足不同类型的数据存储需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值