首页 > 编程知识 正文

redisset和zset的区别,redis 数据结构

时间:2023-05-03 12:02:28 阅读:31375 作者:2305

文章目录一、zset数据结构二、跳表什么是skipList跳表? 1 .查找跳转表2 .插入跳转表3 .删除跳转表4 .更新跳转表

一. zset数据结构

由于sorted set比set添加了权重参数score,因此可以在score中组织集合中的元素,也可以从score范围中检索元素列表。

zset有两个不同的实现:zipListskipList

zipList:

满足以下两个条件:

[score,value]键和值对的数量小于128; 每个元素的长度小于64字节;skipList:

不满足上述两个条件时使用跳转表(3358www.Sina.com/和hash组合) )。

混列用于存储value到score的映射,可以在o(1)小时内找到value的对应分数。 skipList按照从小到大的顺序存储得分; skipList中的每个元素的值为[score,value],对Redis的zset而言不是单一结构,而是skipList

实现方式:在Redis sorted set内部,使用HashMap和跳转表skipList保证数据的存储和有序。 HashMap包含成员到score的映射,但跳转表中存储了所有成员。 排序依据是存储在HashMap中的score,使用跳转表结构可以获得相对较高的搜索效率。 使用跳转表的结构可以获得更高的搜索效率

以下是使用跳表和哈希表的图像。

使用跳转表时的图像:

zset结构既支持单元素查询,也支持范围查询。

二、跳表什么是skipList跳表? 改造链表,在链表中建立索引。 也就是说,每两个节点将一个节点提取到更高级别。 提取的级别称为索引。 http://www.Sina.com/http://www.Sina.com /

由很多层结构组成。 每层都是有序的链表。 最底层(Level 1)的链表包含所有元素。 如果元素位于级别I的链表中,则它也显示在级别I下的链表中。 每个节点包含两个指针,指向同一链表中的下一个元素及其下一级元素。zipList

跳表能保证增加、删除、调查等操作时的时间复杂度为o(logn ),且维持结构平衡的成本比较低,是随机依赖的。 在多次插入和删除四元树后,需要使用Rebalance来重新调整结构平衡。

这种链表加多级索引的结构,就是跳表。

跳台占用的空间比较大,实际上是跳表的特点:的思想。

跳表的优点:

由很多层结构组成。 每层都是有序的链表。 最底层(Level 1)的链表包含所有元素。 如果元素位于级别I的链表中,则它也显示在级别I下的链表中。 每个节点包含两个指针,指向同一链表中的下一个元素及其下一级元素。 1 .跳表查找跳表查找从顶层链表开头的元素开始,然后遍历链表,直到找到元素大于或等于目标元素的节点。 如果当前元素正好等于目标,则直接返回。 如果当前元素小于目标元素,则垂直向下一个级别继续搜索。 如果当前元素大于目标,或到达链表末尾,则移动到上一个节点的位置,垂直下降到下一个级别。

2 .插入跳转表是跳转表插入数据,必须首先找到要插入的位置,然后执行插入操作。

可以在图中看到插入的过程。

如果继续在跳转表中插入元素,则两个索引点之间的节点可能太多。 如果节点过多,创建索引的好处也将消失。 因此,必须保持索引和原始链表的大小平衡。 也就是说,当节点增加时,索引也会相应增加,以避免两个索引之间的节点过多而降低搜索效率。

跳表通过随机函数保持了这个平衡。 在跳转表中插入数据时,也可以同时将此数据插入索引中。 在中,需要随机函数来确定要插入到哪个级别的索引中。

这样,可以有效防止跳跃式仪表劣化,效率降低。

3 .删除跳表自上而下,查找第一个出现的节点的索引,按层次找到对应的节点。 删除在o(logn )层次结构中找到的节点,如果该层次结构中只剩下一个节点,则删除除原始链表以外的整个层次结构。 作为o(logn )整体,跳表的删除操作的时间复杂度为o ) logn。跳表的缺点:

4 .调用更新跳表zadd方法时,如果对应的value不存在,则为插入过程。 如果此值已经存在,并且只是调整score的值,则必须遵循更新流程。 假设这个新的score值不引起排序位置的改变,则不需要调整位置,直接修改元素的score值就可以了。 但是,排序位置改变后,必须调整位置。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。