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

Redis五大数据类型的底层设计

SDS

  • 无论是 Redis 的 Key 还是 Value,其基础数据类型都是字符串。
  • 虽然 Redis是使用标准 C 语言开发的,但并没有直接使用 C 语言中传统的字符串表示,而是自定义了一 种字符串。这种字符串本身的结构比较简单,但功能却非常强大,称为简单动态字符串,Simple Dynamic String,简称 SDS。

SDS 结构

SDS 不同于 C 字符串。C 字符串本身是一个以双引号括起来,以空字符’\0’结尾的字符序 列。但 SDS 是一个结构体,定义在 Redis 安装目录下的 src/sds.h 中:

struct sdshdr { 
// 字节数组,用于保存字符串 
char buf[]; 
// buf[]中已使用字节数量,称为 SDS 的长度 
int len; 
// buf[]中尚未使用的字节数量 
int free; 
} 

在这里插入图片描述
通过以上结构可以看出,SDS 的 buf 值实际是一个 C 字符串,包含空字符’\0’共占 6 个字 节。**但 SDS 的 len 是不包含空字符’\0’的。
**

SDS 的优势

  • 对于 C 字符串,若要获取其长度,则必须要通过遍历整个字符串才可获取到的。对于超 长字符串的遍历,会成为系统的性能瓶颈。 SDS 结构体中直接就存放着字符串的长度数据

  • SDS 采用了空间预分配策略惰性空间释放策略来避免内存再分配问题。

  • 空间预分配策略是指,每次 SDS 进行空间扩展时,程序不但为其分配所需的空间,还会 为其分配**额外的未使用空间,以减少内存再分配次数。**而额外分配的未使用空间大小取决于 空间扩展后 SDS 的 len 属性值。

    • 如果 len 属性值**小于 1M,**那么分配的未使用空间 free 的大小与 len 属性值相同。
    • 如果 len 属性值大于等于 1M ,那么分配的未使用空间 free 的大小固定是 1M。
  • SDS 对于空间释放采用的是惰性空间释放策略

    • 该策略是指,SDS 字符串长度如果缩短, 那么多出的未使用空间将暂时不释放,而是增加到 free 中。以使后期扩展 SDS 时减少内存 再分配次数。 如果要释放 SDS 的未使用空间,则可通过 sdsRemoveFreeSpace()函数来释放。

集合的底层实现原理

  • Redis 中对于 Set 类型的底层实现,直接采用了 hashTable。hashtable就是普通的哈希表(key为set的值,value为null)。
  • 但对于 Hash、ZSet、List 集 合的底层实现进行了特殊的设计,使其保证了 Redis 的高性能。

1 两种实现的选择

  • 对于Hash与ZSet集合,其底层的实现实际有两种:压缩列表zipList,与跳跃列表skipList。
  • 这两种实现对于用户来说是透明的,但用户写入不同的数据,系统会自动使用不同的实现。 只有同时满足以配置文件 redis.conf 中相关集合元素数量阈值与元素大小阈值两个条件****,使用的就是压缩列表 zipList,只要有一个条件不满足使用的就是跳跃列表 skipList。、
  • 例如,对于ZSet 集合中这两个条件如下:
    • 集合元素个数小于 redis.conf 中 zset-max-ziplist-entries 属性的值,其默认值为 128
    • 每个集合元素大小都小于 redis.conf 中 zset-max-ziplist-value 属性的值,其默认值为 64字节

2什么是 zipList

zipList,通常称为压缩列表,是一个经过特殊编码的用于存储字符串或整数的双向链表。 其底层数据结构由三部分构成:**head、entries 与 end。**这三部分在内存上是连续存放的。 在这里插入图片描述

  • prevlength:该部分用于记录上一个 entry 的长度,以实现逆序遍历
  • encoding:该部分用于标志后面的 data 的具体类型。如果 data 为整数类型,encoding固定长度为 1 字节。如果 data 为字符串类型,则 encoding 长度可能会是 1 字节、2 字 节或 5 字节。data 字符串不同的长度,对应着不同的 encoding 长度。(压缩的体现)。

什么是** skipList

skipList,跳跃列表,简称跳表,是一种**随机化的数据结构,基于并联的链表,**实现简单, 查找效率较高。简单来说跳表也是链表的一种,只不过它在链表的基础上增加了跳跃功能。 也正是这个跳跃功能,使得在查找元素时,能够提供较高的效率。

skipList 原理

假设有一个带头尾结点的有序链表。
在这里插入图片描述
为了提升查找效率,在偶数结点上增加一个指针,让其指向下一个偶数结点。
在这里插入图片描述
这样所有偶数结点就连成了一个新的链表(简称高层链表),当然,高层链表包含的节 点个数只是原来链表的一半。此时再想查找某个数据时,先沿着高层链表进行查找。当遇到 第一个比待查数据大的节点时,立即从该大节点的前一个节点回到原链表中进行查找。
在这里插入图片描述
问题:这种对链表分层级的方式从原理上看确实提升了查找效率,但在实际操作时就出现了问 题:由于固定序号的元素拥有固定层级,所以列表元素出现增加或删除的情况下,会导致列表整体元素层级大调整,但这样势必会大大降低系统性能。

优化

为了避免前面的问题,skipList 采用了随机分配层级方式。即在确定了总层级后,每添 加一个新的元素时会自动为其随机分配一个层级。这种随机性就解决了节点序号与层级间的 固定关系问题。
在这里插入图片描述

  • 上图演示了列表在生成过程中为每个元素随机分配层级的过程。从这个 skiplist 的创建 和插入过程可以看出,每一个节点的层级数都是随机分配的,而且新插入一个节点不会影响 到其它节点的层级数。
  • 只需要**修改插入节点前后的指针,**而不需对很多节点都进行调整。这 就降低了插入操作的复杂度。

什么是 quickList

  • List的底层实现: quickList,快速列表,quickList 本身是一个双向无循环链表,它的每一个节点都是一个zipList

  • quickList 本质上是 zipList 和 linkedList 的混合体。其将 linkedList 按段切分,每一段使用 zipList 来紧凑存储若干真正的数据元素,多个 zipList 之间使用双向指针串接起来。当然, 对于每个 zipList 中最多可存放多大容量的数据元素,在配置文件中通过 list-max-ziplist-size属性可以指定。
    在这里插入图片描述

相关文章:

Redis五大数据类型的底层设计

SDS 无论是 Redis 的 Key 还是 Value,其基础数据类型都是字符串。虽然 Redis是使用标准 C 语言开发的,但并没有直接使用 C 语言中传统的字符串表示,而是自定义了一 种字符串。这种字符串本身的结构比较简单,但功能却非常强大&…...

logback的简单配置详解

<?xml version"1.0" encoding"UTF-8"?> <!--logback配置的根元素。scantrue表示logback将定期扫描配置文件以检测更改。scanPeriod"30 Period" 扫描间隔为30s--> <configuration scan"true" scanPeriod"30 seco…...

TatukGIS Developer Kernel使用教程:如何为FMX创建第一个应用程序

概述&#xff1a;TatukGIS Developer Kernel&#xff08;DK&#xff09;是一个用于开发自定义地理信息系统&#xff08;GIS&#xff09;应用程序以及解决方案的综合性软件开发工具包&#xff08;SDK&#xff09;。本篇文章主要介绍用DK11为FMX创建一个应用程序&#xff0c;现在…...

Ant Design Vue设置表格滚动 宽度自适应 不换行

Ant Design Vue设置表格滚动 宽度自适应 不换行 添加以下属性即可解决这个问题&#xff1a; <a-table :columns"columns" :data-source"list":pagination"false"bordered:scroll"{ x: max-content }" >...

在Linux上开启文件服务,需要安装并配置Samba

在Linux上开启文件服务&#xff0c;需要安装并配置Samba。以下是具体步骤&#xff1a; 安装Samba软件包&#xff1a;在终端中输入以下命令进行安装&#xff1a; 复制代码 sudo apt-get update && sudo apt-get install samba 配置Samba&#xff1a;编辑Samba配置文件…...

TypeScript 类型兼容性

TypeScript 类型兼容性 在前端开发中&#xff0c;使用 TypeScript 可以提供更强大的类型检查和类型安全。然而&#xff0c;了解 TypeScript 中的类型兼容性是至关重要的&#xff0c;因为它涉及如何处理不同类型之间的关系&#xff0c;以及在这些类型之间进行无缝的交互。本文将…...

【多线程】线程的状态

我们可以通过下面的这段代码来查看线程一共有哪几种状态 //线程的状态是一个枚举类型 Thread.State for(Thread.State state : Thread.State.values()){System.out.println(state); }NEW&#xff08;新建状态&#xff09;&#xff1a; 当线程对象已经被创建&#xff0c;但是 s…...

pytorch 对图片进行归一化处理

如题&#xff0c;神经网络通常使用浮点数张量作为输入&#xff0c;我们要做的第一件事情就是将图片转化为浮点数&#xff0c;并且做归一化操作。 import torch import imageio import osdata_dirF:\\work\\deep_learning\\pytorch\\dlwpt-code-master\\data\\p1ch4\\image-cat…...

零售数据分析师熬夜整理:人、货、场、供、财这样做

在零售数据分析中&#xff0c;人、货、场、供、财数据分析非常重要&#xff0c;它们分别是指人员、商品、场所、供应和财务&#xff0c;对这些要素进行数据分析&#xff0c;可以更好地了解市场需求、优化商品供应链、调整销售策略和提高盈利能力。零售数据量大、分析指标多且复…...

基于SSM的学生选课管理系统

基于SSM的高校校园学生选课系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 专业管理 教师管理 课程管理 成绩管理 摘要 基于SSM的学生选课管…...

SQL注入漏洞

0x01 漏洞介绍 泛微e-office系统是标准、易用、快速部署上线的专业协同OA软件&#xff0c;国内协同OA办公领域领导品牌&#xff0c;致力于为企业用户提供专业OA办公系统、移动OA应用等协同OA整体解决方案。泛微e-office深谙改革之道以迎变革之机&#xff0c;沉心产品研发数十载…...

C++ wpf自制软件打包安装更新源码实例

程序示例精选 C wpf自制软件打包安装更新源码实例 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《C wpf自制软件打包安装更新源码实例》编写代码&#xff0c;代码整洁&#xff0c;规则&…...

8月19日PMP成绩,预计10月16日公布!附查询入口、流程

PMP的考试成绩一般在考后6-8周即可查询&#xff0c;8月PMP的成绩预计会在北京时间10月16日晚上公布&#xff0c;具体时间以官方公告为准。 如何查询8月考试成绩&#xff1f; 渠道一&#xff1a;收到PMI邮件提醒 当你注册PMI所使用的邮箱收到一封PMI发来的&#xff0c;标题为…...

简易LDO设计(包含原理图、PCB和实验)

一、前置知识 ①该电路是通过三极管&#xff08;BJT&#xff09;来实现的&#xff0c;所以需要知晓三极管的工作原理和特性。 ②三极管有三种状态&#xff1a;放大、饱和、截止。本文是利用三极管的放大状态来模拟LDO芯片的功能。 二、原理图 ①稳压二极管要想稳定到某个电压范…...

SpringBoot面试题5:SpringBoot Starter的工作原理是什么?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:SpringBoot Starter的工作原理是什么? Spring Boot Starter 是一种便捷的方式来为 Spring Boot 应用程序引入一组特定功能的依赖项。它简化了项目…...

Leetcode 2902. Count of Sub-Multisets With Bounded Sum

Leetcode 2902. Count of Sub-Multisets With Bounded Sum 1. 解题思路2. 代码实现3. 算法优化 题目链接&#xff1a;2902. Count of Sub-Multisets With Bounded Sum 1. 解题思路 这一题有点惭愧&#xff0c;因为没有搞定&#xff0c;遇上了超时问题…… 我的思路其实还是…...

ARP协议(地址解析协议) 的作用和操作过程

目录 1.问题: &#xff08;在同一个LAN局域网内&#xff09;如何在已知目的接口的IP地址前提下确定其MAC地址&#xff1f;2.问题&#xff1a;现在假设主机A要向目的主机B发送一个数据报&#xff0c;怎么发送呢&#xff1f;2.1在一个局域网内时2.1.1情况一&#xff1a;2.1.2情况…...

轻游戏风格虚拟资源付费下载模板Discuz论坛模板

轻游戏风格虚拟资源付费下载模板Discuz论坛模板&#xff0c;游戏资讯付费VIP源码模板。 模板说明&#xff1a; 1、模板名称&#xff1a;"qing游戏风格"&#xff0c;版本支持&#xff1a;discuzx3.0版本&#xff0c;discuzx3.1版本&#xff0c;discuzx3.2版本&#…...

MongoDB索引操作

1、创建索引 语句&#xff1a; db.collection.createIndex(keys, options, commitQuorum) 选项参数名类型描述keys 包含排序字段和排序方式的对象&#xff0c; 值&#xff1a; 1为升序索引 -1为降序索引 options参数控制对象backgroundboolean 可选&#xff0…...

AMEYA360:君正低功耗AIoT图像识别处理器—X1600/X1600E

• 高性能 XBurst 1 CPU&#xff0c;主频1.0GHz • 超低功耗 • 内置LPDDR2(X1600&#xff1a;32MB&#xff0c;X1600E&#xff1a;64MB) • 实时控制核XBurst 0&#xff0c;面向安全管理和实时控制 • 丰富的外设接口 应用领域 • 基于二维码的智能商业 • 智能物联网 • 高端…...

EM@圆和圆锥曲线的参数方程

文章目录 abstract圆的参数方程匀速圆周运动的轨迹从普通方程直接转化为参数方程 任意位置圆心的方程参数方程一般方程例 交点问题的参数方程法 圆锥曲线的参数方程椭圆参数方程例椭圆内接矩形的最大面积问题 抛物线参数方程一般位置的抛物线例 双曲线的参数方程点到双曲线的最…...

uniapp 微信小程序 vue3.0+TS手写自定义封装步骤条(setup)

uniapp手写自定义步骤条&#xff08;setup&#xff09; 话不多说 先上效果图&#xff1a; setup.vue组件代码&#xff1a; <template><view class"stepBox"><viewclass"stepitem"v-for"(item, index) in stepList":key"i…...

Python 金融大数据分析

第一章 为什么将python用于金融 python编程语言 python是一种高级的多用途编程语言&#xff0c;广泛用于各种非技术和技术领域。 python是一种具备动态语义、面向对象的解释型高级编程语言。它的高级内建数据结构与动态类型及动态绑定相结合&#xff0c;使其在快速应用开发上…...

初识C++入门(1)

为什么会衍生出C&#xff1f; C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff0c;20世纪80年代&#xff0c;计算机界提出…...

使用Selenium的WebDriver进行长截图

from selenium import webdriver from PIL import Image from io import BytesIO # 创建浏览器驱动 driver webdriver.Chrome()# 打开网页 driver.get("https://www.douban.com/") # 替换为您要截图的网页URL def get_long_shot(driver,table_element):# 获取页面的…...

python+大数据校园卡数据分析 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于yolov5的深度学习车牌识别系统实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;3分 该项目较为新颖&am…...

【机器学习】sklearn降维算法PCA

文章目录 降维PCAsklearn中的PCA代码实践 PCA对手写数字数据集的降维 降维 如何实现降维&#xff1f;【即减少特征的数量&#xff0c;又保留大部分有效信息】 将那些带有重复信息的特征合并&#xff0c;并删除那些带无效信息的特征等等&#xff0c;逐渐创造出能够代表原特征矩…...

华为云云耀云服务器L实例评测|企业项目最佳实践之评测用例(五)

华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践系列&#xff1a; 华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践之云服务器介绍(一) 华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践之华为云介绍(二) 华为云云耀云服务器L实例评测&#xff5…...

Xcode升级到15.0 解决DT_TOOLCHAIN_DIR问题

根据个人开发遇到的问题做的总结&#xff0c;公司要求Xcode 14.2 &#xff0c;Swift 5.7开发&#xff0c;由于升级了Mac 14.0系统后&#xff0c;Xcode 14.2不能使用&#xff0c;解决方案目前有2个 一、在原来Xcode 14.2 的显示包内容&#xff0c;如图 二、升级到Xcode的15.0后…...

小谈设计模式(29)—访问者模式

小谈设计模式&#xff08;29&#xff09;—访问者模式 专栏介绍专栏地址专栏介绍 访问者模式角色分析访问者被访问者 优缺点分析优点将数据结构与算法分离增加新的操作很容易增加新的数据结构很困难4 缺点增加新的数据结构比较困难增加新的操作会导致访问者类的数量增加34 总结…...

淮滨网站建设公司/seo sem是指什么意思

让我们看一下ES2017中引入的一些新语法&#xff0c;以帮助组织有关promise的代码。 在许多情况下&#xff0c;这种新语法&#xff08;即async和await关键字&#xff09;将帮助您编写更具可读性和可维护性的异步代码&#xff0c;但这并非没有缺点。 我们将首先研究如何使用async…...

有阿里云服务器 怎么做网站/百度官方网站网址

目录1. FFmpeg解码瓶颈2. 使用libyuv提升解码效率3. 完整代码1. FFmpeg解码瓶颈 经测试发现&#xff0c;FFmpeg解码瓶颈在YUV转RGB上&#xff0c;在12MP视频的环境下&#xff0c;单帧转换时间超过40ms&#xff0c;效率无法满足要求 FFmpeg的YUV转RGB代码&#xff1a; sws_sca…...

兼职做网站这样的网站/指数基金什么意思

关注我们遇见更好的攻城狮自己!设计电路板最基本的过程可以分为三大步骤&#xff1a;电路原理图的设计&#xff0c;产生网络表&#xff0c;印制电路板的设计。不管是板上的器件布局还是走线等等都有着具体的要求。例如&#xff0c;输入输出走线应尽量避免平行&#xff0c;以免产…...

专注于网站营销服务/谷歌google官方下载

1.创建index.jsp页面。新建表单 注意&#xff1a; action 填写 input&#xff0c;这个之后再web.xml配置时要注意对应。 method 提交 postt <body> <form action"input" method "post"> 用户名&#xff1a;<input type "text"…...

为什么有的公司做很多个网站/深圳网络推广公司排名

1、简单介绍该错误发生的背景&#xff1a; 1&#xff09; 数据库版本&#xff1a;MySQL5.7.19 2&#xff09; 对一个大表修改字段类型DDL&#xff08;将主键id int变为bigint&#xff09;&#xff0c;为了不影响主库业务&#xff0c;先在从库上执行DDL操作&#xff0c;然后通过…...

做网站一定要公司备案吗/北京做网站推广

epoll学习&#xff1a;思考一种高性能的服务器处理框架 终于开始学习epoll了&#xff0c;虽然不明白的地方还是很多&#xff0c;但从理论到实践&#xff0c;相信自己动手去写一个具体的框架后&#xff0c;一切会清晰很多。 1、首先需要一个内存池&#xff0c;目的在于&#xff…...