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 来现整个过程,它的性能有没有降低
相关推荐
3DVisionary8 分钟前
蓝光三维扫描:医疗制造的精度焦虑怎么解
人工智能·算法·制造·蓝光三维扫描·医疗制造·三维检测·义齿检测
好评笔记17 分钟前
机器学习面试八股——常用损失函数
人工智能·深度学习·算法·机器学习·校招
weixin_4684668518 分钟前
全局与局部注意力机制新手实战指南
人工智能·python·深度学习·算法·自然语言处理·transformer·注意力机制
程序员老邢34 分钟前
《技术底稿 43》今日踩坑复盘:Redis 乱码 + MySQL 配置注入失败
redis·技术底稿·redisson 序列化·mysql 配置·项目踩坑·微服务问题排查
_日拱一卒40 分钟前
LeetCode:994腐烂的橘子
java·数据结构·算法·leetcode·深度优先
丷丩1 小时前
Postgresql基础实践教程(十一)各种Join
数据库·postgresql·join
星夜夏空991 小时前
FreeRTOS学习(4)——内存映射
数据库·学习·mongodb
珂朵莉MM1 小时前
第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第3赛季优化题--束搜索
人工智能·算法
TheRouter2 小时前
AI Agent 记忆体系建设实战:短期、长期与工作记忆的工程实现
数据库·人工智能·oracle
Omics Pro2 小时前
首个!外源天然产物综合性代谢图谱
数据库·人工智能·算法·机器学习·r语言