Redis: Sorted Set 底层算法的简单分析

概述

  • 我们先看下 Shorted Set 有序集合的内部数据结构
  • 所谓有序集合,比如有个容器,容器里边都已经排好序了,那无非就是快速的查找和插入
  • 不管你是查找还是插入,肯定要确定那个位置
  • 最简单的办法就是从最开头开始,挨个比较最终找到我们的位置
  • 这个实际上在数据集比较大的时候,它的性能就会比较低了
  • 它的时间复杂度是O(n),实际上可以提升至 O(logn)

算法选择和分析

1 ) 二分查找

  • 在一个单调有序的集合中查找元素
  • 步骤
    • 每次将集合分为左右两部分
    • 判断解在哪个部分中并调整集合上下界
    • 重复直到找到目标元素
  • 时间复杂度 O(logn) 优于直接顺序查找 O(n)
  • 在 Sorted Set 里边不是用二分查找来快速的实现插入和读取的
  • 二分查找的限制是:有序的数组,而 Sorted Set 用的是链表
  • 这里用了一种新的数据结构,叫做跳跃列表 SkipList

2 )跳跃列表 SkipList

  • 它算法的核心思想是用空间换时间

  • 跳表由多条链表 L0 ... LN 以及下行指针构成

  • 最底下的是原始链表,把原始链表里边的这每一个节点,随机做节点升级

  • 第一级索引链表是新构建出来的链表,是原始链表的子集,可理解为其索引

  • 要实现快速查找,基于此种方式,可进行再次升级,如上图所示

  • 这里有4层,L0 ~ L3 这 4 层链表

  • 在原始链表中,比如黄色部分是有序的,它是由score来排序的,浅蓝色为value值

  • 这个节点升级是内部有一个随机的算法,这个随机算法是概率性的

  • 这个算法作者根据概率性,做节点随机升级,就像抛硬币一样

  • 这个算法经过了大量的测试之后,有极少部分情况下会出现O(n)的情况

  • 它不影响整体时间复杂度为 O(logn), 这种属于正常现象

  • 在这个跳跃列表里边,如何去找的呢?

    • 它是从最顶层开始找的,然后找不到回来就往下走,最终到原始链表
    • 在这个过程中找到立即停止,如果没有找到,则查找失败
  • 再来看下链表的构建过程

    • 每一个链表,包括我们的原始链表和上层构建出来
    • 在这些索引列表中,每一个都是从负无穷到正正无穷大
    • 这里面score从负无穷大始一直到正无穷大,然后它内部做了一个排序
  • 现在要去快速的查找和插入它

    • 内部它自己会根据概率算法先升级构建链表
    • 升级之后,现在要去处理,要去找的话,就是从最顶层开始
    • 如上图,逐层跳跃查找
    • 最后用完了链表都找不到,则查找失败
    • 这是完整的查找过程
  • 它实际上是一个zip list,就是压缩的列表

  • 那为什么不用红黑树平衡树来实现,为什么要用跳入列表?

    • 首先,跳跃列表,红黑树,平衡树,它们最终的时间复杂度都是o(logn),就是它们的性能都是一样的
    • 从源码上去出发的话,跳跃列表的实现是完全要简单于红黑树和平衡树的
    • Redis 作者在构建建这个 sorted set 的时候,会有几点考虑
    • 如果用红黑树平衡树,写这个源码的过程中可能会比较复杂
    • 考虑到它要开源,后续可能很多人要过来看源码学习
    • 相对于简单的跳跃列表 skip list 来现整个过程,它的性能有没有降低
相关推荐
bug菌¹9 分钟前
滚雪球学MySQL[8.3讲]:数据库中的JSON与全文检索详解:从数据存储到全文索引的高效使用
数据库·mysql·json·全文索引
nick987612 分钟前
信号处理之中值滤波
人工智能·算法·信号处理
会洗碗的CV工程师23 分钟前
828华为云征文|使用sysbench对Flexus X实例对mysql进行性能测评
数据库·mysql·华为云·压力测试·可用性测试
快乐江小鱼23 分钟前
深入浅出MongoDB(二)
数据库·mongodb
栀夏61323 分钟前
MongoDB 聚合管道
数据库
宇宙超粒终端控制中心28 分钟前
leetcode34. 在排序数组中查找元素的第一个和最后一个位置
算法·leetcode·二分查找
尘浮生29 分钟前
Java项目实战II基于Java+Spring Boot+MySQL的购物推荐网站的设计与实现(源码+数据库+文档)
java·开发语言·数据库·spring boot·mysql·maven·intellij-idea
sp_fyf_202443 分钟前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-01
人工智能·神经网络·算法·语言模型·自然语言处理·数据挖掘
yi碗汤园44 分钟前
C#自定义工具类-数组工具类
开发语言·算法·c#
hunteritself44 分钟前
ChatGPT实时语音将于本周向免费用户推出:OpenAI DevDay 2024详细解读
人工智能·gpt·算法·chatgpt·openai·语音识别