文章目录

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

一、zset数据结构

相比于set,sorted set 增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,还可以通过 score 的范围来获取元素的列表。

zset有两种不同的实现,分别是zipListskipList

zipList:
满足以下两个条件:

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

skipList:
不满足以上两个条件时使用跳表(组合了hashskipList

  • hash用来存储value到score的映射,这样就可以在O(1)时间内找到value对应的分数;
  • skipList按照从小到大的顺序存储分数;
  • skipList每个元素的值都是[score,value]对

Redis 中 zset 不是单一结构完成,是跳表和哈希表共同完成。
实现方式:Redis sorted set的内部使用HashMap和跳跃表(skipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。

使用zipList的示意图如下所示:

使用跳表时的示意图:


zset 结构中,既支持按单个元素查询,又支持范围查询。

二、跳表skipList

什么是跳表?

对链表进行改造,在链表上建索引,即每两个结点提取一个结点到上一级,我们把抽出来的那一级叫作索引。这种链表加多级索引的结构,就是跳表。

跳表的特点:

  • 由许多层结构组成。
  • 每一层都是一个有序的链表。
  • 最底层 (Level 1) 的链表包含所有元素。
  • 如果一个元素出现在 Level i 的链表中,则它在 Level i 之下的链表也都会出现。
  • 每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素。

跳表的优点:
跳表可以保证增、删、查等操作时的时间复杂度为O(logN),且维持结构平衡的成本比较低,完全依靠随机。而二叉查找树在多次插入删除后,需要Rebalance来重新调整结构平衡。

跳表的缺点:
跳表占用的空间比较大(多级索引),其实就是一种空间换时间的思想。

跳表的特点:

  • 由许多层结构组成。
  • 每一层都是一个有序的链表。
  • 最底层 (Level 1) 的链表包含所有元素。
  • 如果一个元素出现在 Level i 的链表中,则它在 Level i 之下的链表也都会出现。
  • 每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素。

1.跳表的查找

跳表的查找会从顶层链表的头部元素开始,然后遍历该链表,直到找到元素大于或等于目标元素的节点,如果当前元素正好等于目标,那么就直接返回它。如果当前元素小于目标元素,那么就垂直下降到下一层继续搜索,如果当前元素大于目标或到达链表尾部,则移动到前一个节点的位置,然后垂直下降到下一层。

2.跳表的插入

为跳表插入数据,首先需要找到插入的位置,然后执行插入操作。
可以通过图看一下插入的过程:

如果我们不停的向跳表中插入元素,就可能会造成两个索引点之间的结点过多的情况。结点过多的话,我们建立索引的优势也就没有了。所以我们需要维护索引与原始链表的大小平衡,也就是结点增多了,索引也相应增加,避免出现两个索引之间结点过多的情况,查找效率降低。

跳表是通过一个随机函数来维护这个平衡的,当我们向跳表中插入数据的的时候,我们可以选择同时把这个数据插入到索引里,那我们插入到哪一级的索引呢,这就需要随机函数,来决定我们插入到哪一级的索引中。

这样可以很有效的防止跳表退化,而造成效率变低。

3.跳表的删除

  1. 自上而下,查找第一次出现节点的索引,并逐层找到每一层对应的节点。O(logN)
  2. 删除每一层查找到的节点,如果该层只剩下1个节点,删除整个一层(原链表除外)。O(logN)

总体上,跳跃表删除操作的时间复杂度是O(logN)。
整个删除过程,可以简化理解为:先找到,断关联,删内存

4.跳表的更新

当我们调用zadd方法时,如果对应的value不存在,那就是插入过程。如果这个value 已经存在了,只是调整一下 score 的值,那就需要走一个更新的流程。假设这个新的score 值不会带来排序位置上的改变,那么就不需要调整位置,直接修改元素的 score 值就可以了。但是如果排序位置改变了,那就要调整位置。

Redis数据结构之Zset相关推荐

  1. zset 怎么get_如何使用RedisTemplate访问Redis数据结构之Zset

    Redis的ZSet数据结构 Redis 有序集合和无序集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过分数来为集合 ...

  2. Redis数据结构详解之Zset(五)

    原文:Redis数据结构详解之Zset(五) 序言 Zset跟Set之间可以有并集运算,因为他们存储的数据字符串集合,不能有一样的成员出现在一个zset中,但是为什么有了set还要有zset呢?zse ...

  3. 为了拿捏 Redis 数据结构,我画了 40 张图

    Redis 为什么那么快? 除了它是内存数据库,使得所有的操作都在内存上进行之外,还有一个重要因素,它实现的数据结构,使得我们对数据进行增删查改操作时,Redis 能高效的处理. 因此,这次我们就来好 ...

  4. 【带你重拾Redis】Redis数据结构及使用场景

    Redis数据结构 Redis有着非常丰富的数据结构,这些数据结构可以满足非常多的应用场景, 如果对这些数据结构有一个比较清晰的认知,使用Redis也会更加得心应手. Redis主要支持以下数据结构: ...

  5. Redis 数据结构的底层实现 (二) dict skiplist intset

    一.REDIS_INCODING_HT (dict字典,hashtable) dict是一个用于维护key和value映射关系的数据结构.redis的一个database中所有的key到value的映 ...

  6. redis 自减命令_Redis 实战 —— 04. Redis 数据结构常用命令简介

    字符串 P39 Redis 的字符串是一个有字节组成的序列,可以存储以下 3 种类型的值:字节串(byte string).整数.浮点数. 在需要的时候, Redis 会将整数转换成浮点数.整数的取值 ...

  7. redis 数据结构

    2019独角兽企业重金招聘Python工程师标准>>> redis对象 redis 数据结构 字符串对象  SDS(简单动态字符串) 列表对象  压缩列表(ziplist) 或 链表 ...

  8. Redis 数据结构与内存管理策略(上)

    Redis 数据结构与内存管理策略(上) 标签: Redis Redis数据结构 Redis内存管理策略 Redis数据类型 Redis类型映射 Redis 数据类型特点与使用场景 String.Li ...

  9. Redis数据结构以及对应存储策略

    redis数据结构: String 可以是字符串也可以是数字,以及浮点数 List,一个链表,链表上每一个节点都包含一个字符串 set 包含字符串的无序手机其,特点是每一个字符都是唯一的 hash,包 ...

最新文章

  1. 4 月 24 日开播!基于神经网络建模的信息传播预测
  2. 用敏捷开发工具leangoo管理需求看板示例
  3. 求均值方差_协方差,方差,标准差
  4. 学习AOP 之前必须明白的几个概念
  5. 网络相关配置,SSH服务,bash, 元字符
  6. 【C语言进阶深度学习记录】三十六 程序与进程的区别(程序的内存布局)
  7. leetcode97 交错字符串
  8. 计算机字符代码表,计算机ASCII码对照表
  9. POJ 3630 Phone List [Trie]
  10. shell应用之cobbler批量部署
  11. Eclipse的界面语言
  12. 电脑如何分盘win10_电脑Win10系统如何一键进入BIOS?
  13. VPX加固机箱学习资料第289篇:基于3U VPX的 5槽加固机箱
  14. 机房布线技术设计与施工
  15. 计算机瞬间黑屏又自动恢复,电脑显示器突然黑屏然后过几秒又自动恢复过来为什么?-显示器黑屏几秒又好...
  16. 以退为进还是被逼无奈?创始人王劲离职后,景驰科技该何去何从?
  17. HDU 5234 Happy birthday 最多蛋糕
  18. Buffer的基本用法
  19. 微服务架构下该如何技术选型呢?
  20. 离线状态下配置深度学习服务器-在ubuntu16.04 上安装python,pip以及包

热门文章

  1. yandex浏览器_使用CSS升级文本编辑器:Yandex的实践
  2. Unity文件夹增强插件Rainbow Folders
  3. (附源码)计算机毕业设计SSM慧学IT精品课程网站
  4. Android平台日志收集系统
  5. Unity—UGUI游戏摇杆的制作
  6. 解决macOS Ventura更改用户头像后系统设置中出现原头像的问题
  7. c++抽奖小程序 源码 简单易懂
  8. Web前端知识CSS(CSS定位、CSS透明、阴影、边框圆角)
  9. 计算机网络基础 之四:网络层
  10. 创建时间Time类,并实例化对象访问测试