【redis 第八篇章】链表结构

一、数组和链表

1、数组

数组会在内存中开辟一块连续的空间存储数据,这种存储方式有利也有弊端。当获取数据的时候,直接通过下标值就可以获取到对应的元素,时间复杂度为 O(1)。但是如果新增或者删除数据会移动大量的数据,时间复杂度为 O(n)。数组的扩容机制是:如果数组空间不足,会先开辟一块新的空间地址,将原来的数组复制到新的数组中。

2、链表

链表不需要开辟连续的内存空间,其通过指针将所有的数据连接起来。新增或者删除的时候只需要将指针指向的地址修改就行了,时间复杂度为 O(1)。但是查询的时间复杂度为 O(n)

二、链表

1、双向链表

在这里插入图片描述

双向链表是各个节点之间的逻辑关系是双向的。
双向链表中节点的组成是:prior: 指向当前节点的前置节点,data:当前节点存储的数据。next:指向当前节点的后置节点。

2、压缩链表

  • 压缩链表是为了节约内存开发的。
  • ziplist是一个特别的双向链表,没有维护双向指针prev next;反而是存储上一个entry的长度和当前entry长度,通过长度推算出下一个元素在什么地方。
  • 牺牲读取的性能,获得高效的存储空间,因为存储指针比存储entry长度更费内存,这就是典型的时间换空间。

3、quicklist链表

  • 官网介绍:
    A doubly linked list of ziplistsA generic doubly linked quicklist implementation
  • 介绍:
    quicklist是一个双向链表,并且是一个ziplist的双向链表,ziplist本身是一个维持数据项先后顺序的列表,而且数据项保存在一个连续的内存块种。

三、对比

1、双向链表

  • 双端链表便于在表的两端进行push和pop操作,但是它的内存开销比较大。
  • 双端链表每个节点上除了要保存的数据之外,还要额外保存两个指针。
  • 双端链表的各个节点是单独的内存块,地址不连续,节点多了容易产生内存碎片。

2、压缩列表

  • ziplist由于是一块连续的内存,所以存储效率很高。
  • ziplist不利于修改操作,每次数据变动都会引发一次内存的realloc。
  • 当ziplist长度很长的时候,一次realloc可能会导致大批量的数据拷贝,进一步降低性能。

3、quicklist链表

  • 空间效率和时间效率的折中。
  • 结合了双端链表和压缩列表的优点。

四、总结

redis 3.2 版本之前使用的是 双向链表和压缩链表 两种,因为双向链表占用的内存要比压缩链表高,所以创建链表时首先会创建 压缩链表,在合适的时机会转化成双向链表redis 3.2 之后使用的是 quicklist链表

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

范伟:大叔这句是咱俩合唱的,赵本山:我唱不上去!——小品《门神》(下)的台词与解说

范伟:大叔这句是咱俩合唱的,赵本山:我唱不上去! ——小品《门神》(下)的台词与解说 (接上) 范伟:大叔快快快走 赵本山:干啥 范伟:上咱家过年…

苹果手机锁屏怎么设置?3个技巧,教你快速设置

在科技与创意交织的时代,苹果手机以其简约而不失优雅的设计,成为了我们日常生活中不可或缺的一部分。而作为手机的【第一印象】,锁屏界面更是彰显用户个性的关键所在。那么,苹果手机锁屏怎么设置呢?接下来,…

AI生成PPT?三款工具让总结更轻松

哎呀,职场新人们,你们是不是也跟我一样,刚开始做PPT的时候,感觉像是走进了一个大迷宫,脑袋里装满了想法,但就是不知道怎么把它们变成一页页漂亮的幻灯片?别急,今天咱们就来聊聊三个超…

【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值

C语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载 本章将分享C增加的几种常见特性,主要内容为引用与内联函数 | auto关键字与for循环 | 指针空值,这些知识看似很多,实际也不少。本章篇幅长&#…

C# Unity 面向对象补全计划 七大原则 之 里氏替换

本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正 本系列作为七大原则和设计模式的进阶知识,看不懂没关系 请看专栏:http://t.csdnimg.cn/mIitr,尤其是关于继承的两篇文章&#xff…

形参和实参的运用

形式参数:定义函数时括号中的变量。只有被调用时才被初始化,函数调用完成后自动销毁,只在函数中有效。 实际参数:真实传递给函数的参数,可以是常量、变量、表达式、函数等。无论实参是何种类型,在调用函数…

DBMS 与 RDBMS

DBMS 与 RDBMS 了解数据库什么是数据库管理系统?Types of DBMS 数据库管理系统的类型T数据库管理系统的好处 关系型数据库管理系统的优点 【纪录片】中国数据库前世今生 在数字化潮流席卷全球的今天,数据库作为IT技术领域的“活化石”,已成为…

JAVA(IO流)7.31

ok了家人们今天还是学习IO流, 一.打印流【了解】 1.1 打印流的概述 我们平时使用的System语句就是调用了print()方法和println()方法。 这两个方法都来自于 java.io.PrintStream 类。 作用: 该类能够方便地打印各种数据类型的值,写入数据后…

【Web】TFCCTF 2024 部分题解

目录 GREETINGS SURFING SAFE_CONTENT FLASK DESTROYER GREETINGS 打express的SSTI GitHub - TheWation/NodeJsSSTI: Express app with Pug templates demonstrating SSTI vulnerability and secure implementation for educational purposes. payload: /result?user…

使用腾讯云域名解析实现网站重定向

前言 最近,在CSDN平台上我写了一系列博客,希望能与同学分享一些技术心得。然而,每当需要向他人推荐我的博客时,那串复杂且缺乏规律的CSDN博客首页域名总让我感到不便。这让我开始思考,如果能将这一域名替换为一个既个…

设计模式的概念

设计模式主要分为三类:创建类的设计模式、结构型设计模式、行为型设计模式。 创建类的设计模式:简单工厂,工厂模式,抽象工厂,建造者,单例,原型 结构型设计模式:代理模式、享元模式 行…

博物馆展厅AI交互数字人,解锁创新的文化交互体验

在智能化时代,博物馆展厅融入AI交互数字人,可以为游客给予实时交互的旅游服务,AI交互数字人可以承担智能引导、讲解、接待、客服与导游等多重角色,为游客塑造崭新的旅游体验。 AI交互数字人相比传统的录屏解说相比,AI…

【无所从来,亦无所去】纪念去世的奶奶和外公「纪念网页」

大家好,我是DX3906 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘大前端领域、真诚分享知识与智慧的小天地!🎇 纪念 2024年 奶奶 85岁、 外公83岁。他们俩分别在今年的2月份和7月份离开了。 时光倒流,奶…

SVPWM5段式7段式差异分析和关键代码基于TI F28035

SVPWM5段式7段式差异分析和关键代码基于TI F28035 5段式有一相占空比始终为0或者1 扇区判断的扇区号和实际扇区不是一一对应,直接使用,而是映射关系 扇区判断变量 7段式和5段式在基本矢量作用顺序上的差异 SVPWM算法详解(已标注重点) 来自这篇文章,但经过实际测试,发现是…

使用Halcon变换与校正图像

使用Halcon变换与校正图像 文章目录 使用Halcon变换与校正图像1. 二维图像的平移、旋转和缩放1.图像的平移2.图像的旋转3.图像的缩放2. 图像的仿射变换3. 投影变换4 实例:透视形变图像校正 由于相机拍摄的时候可能存在角度偏差,因此实际获得的画面可能会…

Chainlit快速实现AI对话应用的界面定制化教程

前言 本文主要讲解如何自定义chainlit实现的网页界面的中的一些可以自定修改的样式的实现教程。比如修改自己的logo网站图标或者主题等 翻译 chainlit 默认网页界面显示的是英文,如果我们想显示为其他语言可以进行以下操作。 翻译文件位于项目根目录下的.chainli…

正点原子imx6ull-mini-Linux驱动之Linux I2C 驱动实验(21)

I2C 是很常用的一个串行通信接口,用于连接各种外设、传感器等器件,在裸机篇已经对 I.MX6U 的 I2C 接口做了详细的讲解。本章我们来学习一下如何在 Linux 下开发 I2C 接口器件 驱动,重点是学习 Linux 下的 I2C 驱动框架,按照指定的…

python中类class的魔法方法

开始介绍之前,我们先看下之前文章我们介绍过的内置类merryview的一些方法,如下图所示: 有很多双下划线开始和结束的method,这么多method是做啥子用的呢? 其实这些方法就是我们常说的魔法方法,也是python中的…

力扣——3143.正方形中的最多点数

题目: 自己的题解(史): PS:自己看了好几遍才看懂题目,然后想看题解,但是又看到了“标签”是 于是靠着自己效率极低的写了出来。 思路:二分 首先利用map,将每个坐标和标…

Es6常用的一些数组处理方法

在平时的开发中,我们很多时候用到数组结构数据,那么如何高效处理数组是可以提高开发效率的,现在越来越多人使用es6,那么它的很多方法简化了我们对数据的操作,比如以前数组循环用for循环写比较多的代码,现在…