首页 > 数据库 >面试官:讲讲redis的zset原理

面试官:讲讲redis的zset原理

时间:2024-11-07 17:19:14浏览次数:7  
标签:面试官 zset redis 链表 跳表 哈希 节点 查找

在 Redis 中,zset(有序集合)是一种既能保存元素的唯一性,又能通过分数进行排序的数据结构。zset 的内部实现基于两种数据结构的组合:跳表(skiplist)和 哈希表(hash table),这两者结合实现了高效的数据存储和快速的排名操作。

1. 跳表(skiplist)

  • 跳表是一种层级化的链表结构,可以理解为多个“平行的链表”,每一层都有不同的跨度。每一层都链接一部分节点,最底层的链表会完整地链接所有节点。
  • 当进行查找或插入操作时,跳表会通过跳过一些中间节点来加速搜索,尤其适合用于排序的快速查找
  • 在 Redis 的 zset 中,跳表结构按照每个元素的分数(score)排序,允许 Redis 高效地进行范围查找(比如“查找分数在一定范围内的元素”)和顺序操作(比如“取前 N 个元素”)。

2. 哈希表(hash table)

  • Redis 使用哈希表来存储元素的唯一性快速定位
  • 每个元素的成员名(member)作为哈希表的 key,分数作为值,这样我们可以通过哈希表快速地检查一个成员是否存在,并且在 O(1) 的时间复杂度下读取或更新其分数。

3. 两者结合

  • zset 中,每个元素的分数会存储在跳表中来保证排序,同时在哈希表中存储用于快速访问。
  • 这种结合使得 zset 可以在 O(log N) 的时间内完成插入、删除、更新等操作,且还能维持元素的唯一性和排序。

为什么使用跳表?

跳表的基本思想

假设我们有一个链表来存储一系列排序好的数据。通常情况下,如果你要在链表中查找某个数据,你只能一个个节点往后走,效率较低(O(n))。而跳表通过增加额外的“跳跃”层级来实现更快的查找

跳表的结构

跳表可以看成是一层一层的链表:

  • 底层:是完整的链表,包含所有的数据节点。
  • 上层:是每隔几个节点抽取一个的链表,只包含部分数据节点。
  • 每一层的节点可以跳跃更多节点,逐层往上,节点数会越来越少。

就像上图那样。比如要找42,那么先找到L3 的14,往下走,到L2,还是14,往下走,找到L1 的34,往下走,找到42.

每一层选择的数字都是随机的,但是遵循的概率为1/2,1/4....

为什么Redis选择使用跳表而不是红黑树来实现有序集合?

Redis 中的有序集合(zset) 支持的操作:

  1. 插入,删除,查找,有序输出一个元素

  2. 按照范围区间查找元素(比如查找值在 [1, 100] 之间的数据)

其中,第一条红黑树也可以完成,且时间复杂度跟跳表相同。但第二条查找数据这个操作,跳表更方便,因为找到以后往后遍历就可以了,很高效。

标签:面试官,zset,redis,链表,跳表,哈希,节点,查找
From: https://blog.csdn.net/m0_64303245/article/details/143575318

相关文章

  • 使用 Redis 进行数据同步
    在Java中使用Redis进行数据同步主要涉及到以下几个方面:数据存储与读取:使用Redis作为缓存或数据库,将数据存储到Redis中并在需要时从Redis中读取。数据一致性:确保主存储(通常是数据库)与Redis缓存之间的一致性。分布式锁:用于保证在高并发场景下对共享资源的操作是......
  • Redis内存管理——针对实习面试
    目录Redis内存管理Redis的内存淘汰机制有哪些?说说过期的数据的删除策略?Redis是如何判断数据是否过期的?Redis如何处理大Key问题?Redis内存管理Redis的内存淘汰机制有哪些?Redis的内存淘汰机制主要包括以下几种策略:noeviction:这是默认策略,当内存使用达到限制时,Red......
  • Redis4:Redis的Java客户端
    欢迎来到“雪碧聊技术”CSDN博客!在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目......
  • Redis使用IO多路复用进行事件处理机制
    一、epoll多路复用这里重点要说的就是redis的IO编程模型,首先了解下为什么要有多路复用呢?案例引用知乎上一个高赞的回答来解释什么是I/O多路复用。假设你是一个老师,让30个学生解答一道题目,然后检查学生做的是否正确,你有下面几个选择:第一种选择:按顺序逐个检查,先检查A,然后是B,之后是C......
  • 150道MySQL高频面试题,学完吊打面试官--InnoDB索引与MyISAM索引实现的区别+一个表中如
    前言本专栏为150道MySQL大厂高频面试题讲解分析,这些面试题都是通过MySQL8.0官方文档和阿里巴巴官方手册还有一些大厂面试官提供的资料。MySQL应用广泛,在多个开发语言中都处于重要地位,所以最好都要掌握MySQL的精华面试题,这也是面试官最喜欢问的,现在面试官在面试的时候更关......
  • Redis集群高可用实战部署(Redis Cluster High Availability Practical Deployment)
     ......
  • Redis1:初识Redis
    欢迎来到“雪碧聊技术”CSDN博客!在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目......
  • 数据库Redis篇
    系列文章目录第一章C/C++语言篇第二章计算机网络篇第三章操作系统篇第四章数据库MySQL篇第五章数据库Redis篇第六章场景题/算法题第七篇常见HR问题篇本系列专栏:点击进入后端开发面经关注走一波秋招阶段,面过很多大中小厂,积攒了很多面经,都是高频问题!!!前言:本系......
  • springboot整合redis详细教程
     前言什么是redis? Redis是一个开源的高性能键值存储系统,通常用作数据库、缓存或消息代理。以下是对Redis的详细介绍:1.基本特性速度快:Redis的读写速度非常快,可以达到每秒数万次的读写操作。多种数据结构:支持字符串、列表、集合、有序集合、散列、位图、超日志和地理......
  • 基于Redis的Token认证机制
    Redis数据库设计/***rediskey前缀*/publicstaticfinalStringREDIS_KEY_PREFIX="easylive:";/***验证码key*/publicstaticfinalStringREDIS_KEY_CHECK_CODE=REDIS_KEY_PREFIX+"check_code:";/***Rediskeytokenweb*/publicstati......