当前位置: 首页 > news >正文

Redis数据结构——快速列表quicklist、快表

定义

Redis中的数据结构,链表和压缩列表这两种数据结构是列表对象的底层实现方式。
当时考虑到链表的附加空间太大,节点的内存都是单独分配的,还会导致内存碎片化问题严重。
因此从Redis3.2开始,对列表的底层数据结构进行了改造,即使用quickList代替链表list和压缩列表ziplist

快速链表quickList实际上是ziplist和linkedlist的混合体,它将linkedlist按段切分,每一段使用ziplist来紧凑存储,多个ziplist之间使用双向指针串接起来。

每个节点的类型是quickListNode,一个quickListNode就是一个压缩列表ziplist,quickListNode的结构是这样的:

typedef struct quicklistNode {struct quicklistNode *prev; //上一个node节点struct quicklistNode *next; //下一个nodeunsigned char *zl;            //保存的数据 压缩前ziplist 压缩后压缩的数据unsigned int sz;             //ziplist 的大小 unsigned int count : 16;     // 压缩列表中节点的数量 unsigned int encoding : 2;   // 编码格式 // ..... 
} quicklistNode;

quickList的常用操作

插入

当插入一个数据时,就会有两种可能:

  • 要么新建一个quickListNode,即一整个ziplist;
  • 要么直接在ziplist中进行插入

同时插入的位置也有两种可能,要么在表头或表尾,要么在中间位置。
因此Redis结合以上因素,规定的插入操作
当插入位置是表头或表尾时:

  • 当在表头或表尾插入数据时,如果数据没有超过规定的大小,那么就插入到表头或表尾节点的ziplist中。
  • 如果要插入的数据的大小超过了限制,那么就会新创建一个quickListNode,即新创建一个压缩列表,然后插入到表尾或表尾

当插入的位置是中间时,还要考虑是在这个ziplist中的那个位置插入:
当插入的位置是ziplist的头部或尾部时:

  • 当要插入的位置所在的ziplist能够继续放得下这个数据,那么就插入到这个ziplist中;
  • 当要插入的位置所在的ziplist,如果继续存放该数据,那么就会超出单个ziplist的大小限制,如果此时这个ziplist相邻的ziplist能够放得下这个数据,就放到相邻的ziplist中。
  • 如果当前的ziplist无法放得下这个数据,同时相邻的ziplist也无法放得下这个数据,那么就要新创建一个quickListNode,即一个新的ziplist。

当要插入的位置是ziplist的中间时,既不是ziplist的首尾位置:

  • 如果当前的ziplist能够放得下这个数据,则进行插入
  • 如果要当前的ziplist无法放得下这个数据,则会在指定的位置进行分裂,将此数据放下,前后溢出的数据就放在前后的ziplist中

查找

quicklist的查找操作就是遍历每个quickListNode,因为每个quickListNode有前后指针,所以可以进行查找操作。

参考文章

Redis数据结构——快速列表(quicklist) - 随心所于 - 博客园

相关文章:

Redis数据结构——快速列表quicklist、快表

定义 Redis中的数据结构,链表和压缩列表这两种数据结构是列表对象的底层实现方式。 当时考虑到链表的附加空间太大,节点的内存都是单独分配的,还会导致内存碎片化问题严重。 因此从Redis3.2开始,对列表的底层数据结构进行了改造&…...

excel统计函数篇3之rank系列

下面这三个函数都是返回指定数据在指定范围中的数据中的名次 1、RANK(number,ref,[order]):返回一列数字的数字排位(数字排位是相对于列表中其他值的大小) rank(数字,数字序列,升序/降序) – 数字在数字序列中的名次 2、RANK.AV…...

Flink 火焰图

方式一 使用 Flink Web UI 的 Flame Graph Flink 自己也支持了 Task 粒度的 Flame Graphs 功能,并且可以细化到 subtask 粒度。 第一步:配置启用功能 Flink 作业动态参数里增加配置:“rest.flamegraph.enabled”: “true” 并重启作业。当前…...

kubectl get 中英文对照

wlzx059node01:~$ kubectl get --help Display one or many resources. (显示一个或多个资源。)Prints a table of the most important information about the specified resources. You can filter the list using a label selector and the --selector flag. If the desired …...

R语言APSIM模型进阶应用与参数优化、批量模拟实践技术

随着数字农业和智慧农业的发展,基于过程的农业生产系统模型在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农田固碳和温室气体排放等领域扮演着越来越重要的作用。APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生…...

无涯教程-Perl - times函数

描述 此函数返回一个四元素列表,为当前进程及其子进程提供用户,系统,子进程和子系统时间。 语法 以下是此函数的简单语法- times返回值 此函数返回ARRAY,($usertime,$systemtime,$childsystem,$childuser) 例 以下是显示其基本用法的示例代码- #!/usr/bin/perl -w($use…...

《计算机网络:自顶向下方法》第五章--网络层:控制平面

控制平面作为一种网络范围的逻辑,不仅控制沿着从源主机到目的主机的端到端路径间的路由器如何转发数据报,而且控制网络层组件和服务如何配置和管理 传统上,控制平面功能与数据平面的转发功能在一起实现,在路由器中作为统一的整体…...

Mysql存储引擎中InnoDB与Myisam的主要区别

在mysql命令窗口中,输入show engins,可以看到mysql的所有引擎,那么这么多的引擎,我们经常使用到的也就两种,MyISAM和InnoDB,这两种引擎究竟有什么区别呢? 1, 事务处理 innodb 支持事务功能,myisam 不支持。 Myisam 的执行速度更快,性能更好。 2,select ,update ,inse…...

数据仓库 ODS->DWD->DWS->ADS

1.数据仓库DW 1.1简介 Data warehouse(可简写为DW或者DWH)数据仓库,是在数据库已经大量存在的情况下,为了进一步挖掘数据资源、为了决策需要而产生的,它是一整套包括了etl、调度、建模在内的完整的理论体系。数据仓库…...

【SpringBoot】SpringBoot获取不到用户真实IP怎么办

文章目录 前言问题原因解决方案修改Nginx配置文件SpringBoot代码实现 前言 项目部署后发现服务端无法获取到客户端真实的IP地址,这是怎么回事呢?给我都整懵逼了,经过短暂的思考,我发现了问题的真凶,那就是我们使用了N…...

LightDB 23.3 plorasql 函数支持inout参数输出

开篇立意 oracle PLSQL函数中返回值有两种情况: (1)使用return返回值; (2)使用out修饰的参数(oracle不支持inout) SQL> create function yu(id inout int) return int asbeginn…...

SpringBoot第41讲:SpringBoot集成Redis - 基于RedisTemplate+Jedis的数据操作

SpringBoot第41讲:SpringBoot集成Redis - 基于RedisTemplate+Jedis的数据操作 Redis是最常用的KV数据库,Spring 通过模板方式(RedisTemplate)提供了对Redis的数据查询和操作功能。本文是SpringBoot第41讲,主要介绍基于RedisTemplate + Jedis方式对Redis进行查询和操作的案…...

用 React+ts 实现无缝滚动的走马灯

一、走马灯的作用 走马灯是一种常见的网页交互组件,可以展示多张图片或者内容,通过自动播放或者手动切换的方式,让用户能够方便地浏览多张图片或者内容。 本次实现的不是轮播图而是像传送带一样的无限滚动的形式。 二、需求梳理 走马灯可设…...

三维模型OSGB格式轻量化重难点分析

三维模型OSGB格式轻量化重难点分析 在三维模型应用中,为了适应移动设备的硬件和网络限制等问题,OSGB格式轻量化处理已经成为一个重要的技术手段。但是,在实际应用中,OSGB格式轻量化仍然存在着一些重难点问题。下面将对这些问题进行…...

C#__事件event的简单使用:工具人下楼问题

// 工具人类 namespace DownStair {delegate void DownStairDelegate(); // 定义了一个下楼委托class ToolMan{public string Name { get; set; } // 声明工具人的名字属性// public DownStairDelegate downStairDelegate null; // 初始化委托downStair为空委托// 解决方案pu…...

初识Spring-ioc

初识Spring-ioc 1. Spring的简介2.Spring容器ioc的特点3.spring注入方式1.Setter方法注入(Setter Injection):通过Setter方法来注入依赖。在类中定义对应的Setter方法,并在方法中接收依赖的参数,Spring容器会通过调用S…...

windows10 安装WSL2, Ubuntu,docker

AI- 通过docker开发调试部署ChatLLM 阅读时长:10分钟 本文内容: window上安装ubuntu虚拟机,并在虚拟机中安装docker,通过docker部署数字人模型,通过vscode链接到虚拟机进行开发调试.调试完成后,直接部署在云…...

Java面试题目汇总

一、面向对象的三个基本特征 2、方法重载和方法重写的概念和区别 3、接口和内部类、抽象类的特性 4、文件读写的基本类 **5、串行化的注意事项以及如何实现串行化 6、线程的基本概念、线程的基本状态以及状态之间的关系 7、线程的同步、如何实现线程的同步 8、几种常用的数据结…...

【ARM 嵌入式 编译系列 6 -- GCC objcopy, objdump, readelf, nm 介绍】

文章目录 GCC objcopy 简介objcopy 常用参数GCC objdump 简介GCC readelf 介绍GCC nm 介绍上篇文章:ARM 嵌入式 编译系列 5 – GCC 内建函数 __builtin 详细介绍 下篇文章:ARM 嵌入式 编译系列 7 – ARM GCC 链接脚本详细讲解 GCC objcopy 简介 objcopy 是 GNU二进制工具集(…...

c语言每日一练(9)

前言:每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...