【Redis】底层跳表实现

先巩固Redis的数据类型以及底层的数据结构:

ZSet(有序集合)可以使用两种不同的内部数据结构来表示:压缩列表(ziplist)和跳跃表(skiplist)。

跳表是redis底层SortedSet(ZSet)的数据结构实现,是ZSet的灵魂所在;set是一个无序集合,而ZSet是有序集合。

ZSet使用压缩列表情况:

1.有序集合保存的元素数量小于128个;

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

如果元素数量或元素大小超过了以上限制就会转换为跳表存储。

 跳表

为提升查找的性能,Redis就引⼊了跳表,跳表在链表的基础上,给链表增加了多级的索引,通过

索引可以⼀次实现多个节点的跳跃,提⾼性能。

链表

 

Redis中的跳表

 

Redis中跳表单个节点定义:

 

ele:SDS结构,⽤来存储数据。

score:节点的分数,浮点型数据

backward:指向上⼀个节点的回退指针,⽀持从表尾向表头遍历,也就是ZREVRANGE这个命令

level:level结构体数组就是⽤来保存各个索引层级的forward指针和span信息的。具体来说,level[0] 表示最底层索引,level[1]为第⼆层索引,以此类推。 higher level的forward指向更远的节点,可以快速 遍历。span记录索引跨度。通过维护多级索引,跳表可以通过较⾼层级的索引快速定位到⽬标节点附 近,然后再在底层索引线性查找,平均时间复杂度为O(logN)。所以,level数组在跳表中的作⽤就是记录 多级索引的数据,让跳表可以实现更快的查找、遍历、排序等操作。

 举个例子:

例如查找元素abcd:

 

如果要查找「元素:abcd,权重:4」的节点,查找的过程:

  1. 1.先从头节点的最⾼层开始,L2 指向了「元素:abc,权重:3」节点,这个节点的权重⽐要查找节点的⼩,所以要访问该层上的下⼀个节点;
  2. 但是该层的下⼀个节点是空节点( leve[2]指向的是空节点),于是就会跳到「元素:abc,权重:3」节点的下⼀层去找,也就是 leve[1];
  3. 「元素:abc,权重:3」节点的 leve[1] 的下⼀个指针指向了「元素:abcde,权重:4」的 节点,然后将其和要查找的节点⽐较。虽然「元素:abcde,权重:4」的节点的权重和要查 找的权重相同,但是当前节点的 SDS 类型数据「⼤于」要查找的数据,所以会继续跳到「元 素:abc,权重:3」节点的下⼀层去找,也就是 leve[0];
  4. 「元素:abc,权重:3」节点的 leve[0] 的下⼀个指针指向了「元素:abcd,权重:4」的节 点,该节点正是要查找的节点,查询结束。

redis跳表的单个节点有⼏层

层次的决定,需要⽐较随机,才能在各个场景表现出较为平均的性能,这⾥Redis使⽤概率均衡的思 路来确定新插⼊节点的层数:Redis跳表决定每⼀个节点,是否能增加⼀层的概率为25%,⽽最⼤层数限 制在Redis5.0是64层在Redis7.0是32层。

redis跳表的性能优化了多少

平均时间复杂度都是O(logn),区别是⼆叉树最坏情况下也是O(logn)⽐较稳定,⽽跳表的最坏时间复杂度是O(N)。当然,实际的⽣产过程 中,体现出来的基本都是跳表的平均时间复杂度。 前⾯也提到,有序集合⽆论是查找、还是增加删除元素,都是需要先定位到数据位置,所以跳表将这三个操作的时间复杂度,都从O(N)降低到了O(logn)。

为什么使用跳表不适用红黑树或二叉树呢

1.因为跳表可以快速的范围查找;

2.跳表的实现比红黑树 简单易懂。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/531433.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA并发编程(二)_线程池

JAVA线程池 1.1Java 线程池之 Executor 框架 为了实现线程池和管理线程池,JDK 给我们提供了基于 Executor 接口的一系列接口、抽象类、实现类,我们把它称作线程池的 Executor 框架,Executor 框架本质上是一个线程池; ​ Java 线…

Linux LVM磁盘扩容

1、查看磁盘情况 df -h df -h2、查看逻辑卷 lvdisplay lvdisplay3、查看逻辑组 vgdisplay vgdisplay4、查看物理卷 pvdisplay pvdisplay5、查看磁盘 fdisk -l fdisk -l6、磁盘分区fdisk /dev/磁盘名 # 上一步查看到的新硬盘路径 fdisk /dev/vdb7、格式化磁盘mkfs -t ext4…

【负载均衡——一致性哈希算法】

1.一致性哈希是什么 一致性哈希算法就很好地解决了分布式系统在扩容或者缩容时,发生过多的数据迁移的问题。 一致哈希算法也用了取模运算,但与哈希算法不同的是,哈希算法是对节点的数量进行取模运算,而一致哈希算法是对 2^32 进…

基于SSM+Jsp+Mysql的超市管理系统

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…

图片管理系统:原理、设计与实践

title: 图片管理系统:原理、设计与实践 date: 2024/4/9 20:04:25 updated: 2024/4/9 20:04:25 tags: 图片管理存储组织上传采集处理编辑搜索检索展示分享AI应用 第一章:图片管理系统概述 1.1 图片管理系统简介 图片管理系统是一种用于存储、组织、处理…

【Java网络编程】IP网络协议与TCP、UDP网络传输层协议

1.1、IP协议 当应用层的数据被封装后,想要将数据在网络上传输,数据究竟要被发往何处,又该如何精准的在网络上定位目标机器,此时起到关键作用的就是“IP协议”。IP协议的作用在于把各种数据包准确无误的传递给目标方,其…

力扣HOT100 - 56. 合并区间

解题思路: class Solution {public int[][] merge(int[][] intervals) {// 先按照区间起始位置排序Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);int[][] res new int[intervals.length][2];int idx -1;for (int[] interval : intervals) {//直接加入的…

前端实现打开新标签页后,再次定位到该标签页

需求 A 页面中点击按钮可以打开新的标签页 B 并且向 B 页面发送消息数据。 当新的标签页 B 未关闭且符合同源策略时&#xff0c;再次点击按钮&#xff0c;可以自动跳转到标签页 B 并且发生消息数据。 B.html <script>window.onmessage evt > {console.log(evt.d…

wps的1)2)3)编号,怎么更新

全部选中->格式刷->把它刷了必须全部选中

应急响应-挖矿脚本检测指南威胁情报样本定性文件清除入口修复

一、演示案例-挖矿样本-Win&Linux-危害&定性 危害&#xff1a;CPU拉满&#xff0c;网络阻塞&#xff0c;服务器卡顿等 定性&#xff1a;威胁情报平台上传解析分析&#xff0c;文件配置查看等windows样本 linux样本 二、演示案例-Linux-Web安全漏洞导致挖矿事件 某公司…

20240403-算法复习打卡day43||● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

1049. 最后一块石头的重量 II class Solution { public:int lastStoneWeightII(vector<int>& stones) {vector<int> dp(15001, 0);int sum 0;for (int i 0; i < stones.size(); i) sum stones[i];int target sum / 2;for (int i 0; i < stones.siz…

C/C++与Python:各自的优势与前景展望

在讨论C/C和Python这两种编程语言的前景时&#xff0c;我们必须认识到每种语言都有其独特的定位和应用场景&#xff0c;并不存在绝对意义上的“谁更有前景”。它们分别在不同的领域发挥着重要作用&#xff0c;而且在未来的技术发展过程中&#xff0c;二者都将继续保持其不可替代…

600MA线性锂电池充电芯片 - YB4054DJ

描述: YB4054一款完整的单节锂离子电池充电器。其SOT23-5的封装与较少的外部元件数使得YB4054成为便携式应用的理想选择。采用了内部PMOSFET架构&#xff0c;加上防倒充电路&#xff0c;不需要外部检测电阻器和隔离二极管。热反馈可对充电电流进行自动调节&#xff0c;以便在大…

接口自动化测试要做什么?一文3个步骤带你成功学会!

先了解下接口测试流程&#xff1a; 1、需求分析 2、Api文档分析与评审 3、测试计划编写 4、用例设计与评审 5、环境搭建&#xff08;工具&#xff09; 6、执行用例 7、缺陷管理 8、测试报告 了解了接口测试的工作流程&#xff0c;那"接口自动化测试"怎么弄&#xff1…

深入浅出Redis(十一):Redis四种高级数据结构:Geosptial、Hypeloglog、Bitmap、Bloom Filter布隆过滤器

引言 Redis提供丰富的数据结构来解决各种场景下的问题&#xff0c;前段时间的一篇文章深入浅出Redis&#xff08;一&#xff09;&#xff1a;对象与数据结构已经深入浅出的说明Redis中的常用基础对象与数据结构 本篇文章将作为那篇文章的补充&#xff0c;深入浅出的解析另外四…

“春招市场”鸿蒙岗位增长163%!你想活出怎样的代码人生?

前段时间“智联招聘崩了”登上微博热搜。不少网友都感叹&#xff0c;可想而知今年的就业压力有多大&#xff0c;找工作真的太难了…… 金三银四&#xff0c;大家的求职热情暴涨到服务器都承受不住&#xff0c;都想在1179万毕业生中脱颖而出&#xff0c;开年春招就已经热辣滚烫……

B站广告推广操作教程及费用?

哔哩哔哩&#xff08;B站&#xff09;作为国内极具影响力的年轻人文化社区&#xff0c;已成为众多品牌与企业触达目标受众、提升品牌影响力的重要阵地。然而&#xff0c;面对B站复杂的广告系统与精细化运营需求&#xff0c;许多广告主可能对如何高效开展B站广告推广感到困惑。云…

03-JAVA设计模式-组合模式

组合模式 什么是组合模式 组合模式&#xff08;Composite Pattern&#xff09;允许你将对象组合成树形结构以表示“部分-整体”的层次结构&#xff0c;使得客户端以统一的方式处理单个对象和对象的组合。组合模式让你可以将对象组合成树形结构&#xff0c;并且能像单独对象一…

Python零基础从小白打怪升级中~~~~~~~文件和文件夹的操作 (1)

第七节&#xff1a;文件和文件夹的操作 一、IO流&#xff08;Stream&#xff09; 通过“流”的形式允许计算机程序使用相同的方式来访问不同的输入/输出源。stream是从起源&#xff08;source&#xff09;到接收的&#xff08;sink&#xff09;的有序数据。我们这里把输入/输…

Llama 3下月正式发布,继续开源!

4月10日&#xff0c;Techcrunch消息&#xff0c;Meta在本周伦敦举办的一场活动中确定&#xff0c;下个月将正式发布Llama 3并且继续开源。 Meta全球事务总裁Nick Clegg表示&#xff0c;我们希望在下个月&#xff0c;甚至更短的时间内&#xff0c;正式推出新一代基础模型Llama …