ZSet的底层实现原理

news/2024/7/24 8:37:34 标签: 数据结构, java, 链表

文章目录

        • 1、zset底层数据结构?简单说说跳表底层数据结构
        • 2、什么时候采用压缩列表、什么时候采用跳表?
        • 3、跳表的时间复杂度?
        • 4、简单描述一下跳表如何查找某个元素
        • 5、zset为什么用跳表而不用二叉树或者红黑树?
        • 6、zset的底层实现


1、zset底层数据结构?简单说说跳表底层数据结构

zset数据结构是压缩列表; 跳表:在链表的基础上,增加了多级索引,通过多级索引位置的转跳,实现了快速查找元素。

image-20230302195118071

2、什么时候采用压缩列表、什么时候采用跳表?

①有序集合保存的元素数量小于128个

②有序集合保存的所有元素的长度小于64字节

以上两种情况采用压缩列表

3、跳表的时间复杂度?

跳表:O(logN) 普通链表:O(N)

4、简单描述一下跳表如何查找某个元素

跳表是一种支持快速查找、插入和删除的数据结构,其查询时间复杂度为O(log n)。

在跳表中,每个节点都有多个指针,指向同一列中的其他节点。这些指针被称为“跳跃指针”,用于快速遍历跳表。

要查找某个元素,可以从跳表的顶部开始遍历,沿着每个节点的跳跃指针向下移动,直到找到大于或等于目标元素的节点。然后,从该节点开始沿着普通指针向右移动,直到找到目标元素或到达链表的末尾。

如果跳表中不存在目标元素,则遍历将结束并返回空值。

由于跳表中每个节点都有多个跳跃指针,因此每个节点的平均跳跃长度较长,可以在O(log n)的时间内遍历跳表。这种快速查找的能力使得跳表在实际应用中得到广泛使用,如Redis等一些缓存系统中。

image-20230302202043904

5、zset为什么用跳表而不用二叉树或者红黑树?

跳表支持范围查找:跳表的效率比红黑树高,并且实现起来也简单

6、zset的底层实现

在Redis中,Zset(有序集合)是一种有序的、非重复的数据结构。它的底层实现是一种称为“跳跃表”(Skip List)的数据结构,它是一种随机化数据结构,能够快速地支持插入、删除、查找操作,并且具有可预测的性能。

跳跃表由多个层级组成,每个层级都是一个有序链表。在一个有序链表中,每个节点包含一个值和一个指向下一个节点的指针。在跳跃表中,每个节点也包含多个指向下一层节点的指针。这些指针是随机生成的,因此跳跃表的层数是随机的,但通常情况下不会超过log(N)层,其中N是跳跃表中元素的个数。

为了实现有序性,跳跃表中每个节点都包含一个分值,它用来对节点进行排序。在Redis中,Zset中的每个元素都是一个键值对,其中键是元素的值,值是元素的分值。跳跃表中的节点通过分值进行排序,这样就可以实现有序集合。

在Redis中,Zset还有一个叫做“字典”的数据结构,它用来保存元素值和元素分值之间的映射关系。字典使用哈希表实现,可以快速地根据元素值查找元素分值。这样,在对Zset进行查找、插入、删除等操作时,可以同时使用跳跃表和字典来实现高效的操作。

总的来说,Zset底层的实现是一种高效的、随机化的数据结构,能够支持有序集合的各种操作,并且具有可预测的性能。


http://www.niftyadmin.cn/n/143698.html

相关文章

10分钟搞懂,Python接口自动化测试-接口依赖-实战教程

今天主要和大家介绍如何提取token、将token作为类属性全局调用及充值接口如何携带token进行请求。话不多说,我们往下看! 接口自动化测试接口依赖视频地址:https://www.bilibili.com/video/BV1914y1F7Bv 目录:导读 一、场景说明 …

研报精选230312

目录 【行业230312中航证券】军工行业周报:成交回暖、关注提升【行业230312山西证券】煤炭行业周报:年报业绩快报密集披露,关注超预期个股【行业230312中航证券】航天产业月报:卫星产业迎来高光时刻,关注业绩兑现持续性…

JVM—本地方法接口

本地方法接口 在讲Java虚拟机运行时数据区中本地方法栈之前,我们先来说说运行时数据区之外的一个叫本地方法接口的东西简称JNI(Java Native Interface) 简单来讲,一个Native Method就是一个java调用非java代码的接口,…

【C++ | 基础语法】

C基础语法1.函数的重载2.引用引用的用法1.引用做参数2.引用返回1.函数的重载 在C中&#xff0c;函数是支持重载的。什么是重载呢&#xff1f; 重载的意思就是函数名相同&#xff0c;但是参数的个数、类型不同。 例如&#xff1a; void func() {cout << "func()&…

知识图谱之py2neo

py2neo介绍介绍Py2neo是一个客户端库和工具包&#xff0c;用于从Python应用程序和命令行使用Neo4j&#xff08;Neo4j Graph Data Platform | Graph Database Management System&#xff09;。该库同时支持 Bolt 和 HTTP&#xff0c;并提供高级 API、OGM、管理工具、交互式控制台…

C#开发的OpenRA的游戏主界面怎么样创建8

继续游戏主界面创建的主题, 接着下来,就剩最下面的功能了,但是也是最复杂的一部分, 因为这是实现整个游戏的交互功能,比如单人玩游戏的选择, 多人玩游戏的选择,还游戏设置等等内容,如下图: 这部分的功能都是定义在文件mainmenu.yaml里,如下: Container@MENUS: X: (W…

Java 多线程 --- 线程同步 CAS机制与Java原子类

Java 多线程 --- 线程同步 CAS机制与Java原子类CAS机制为什么使用CAS机制CAS机制原理Java 原子变量类CAS机制 为什么使用CAS机制 public void incremnt() {sychronized(this) {count;} }实际上&#xff0c;这里使用锁来保障原子性显得有点杀鸡用牛刀的样子.锁固然是功能最强大…

SAP 消息类的创建和应用

SAP 消息类的创建和应用 一、消息类创建 登录SAP系统&#xff0c;使用事务码SE91&#xff0c;输入需要创建的消息类名&#xff1a;ZMSG_DM01&#xff0c;点击创建。 进入界面后输入短文本&#xff0c;点击保存&#xff0c;给消息类分配包&#xff0c;或者建在本地。 点击消…