《Redis设计与实现》阅读总结-1

news2024/11/15 15:52:23

第 2 章 简单动态字符串(SDS)

1. Redis使用自己构建一种名为简单动态字符串(simple dynamic string ,SDS)的抽象类型,作为Redis的默认字符串。

2. SDS的结构:

        free属性:表示这个SDS没有分配任何使用的空间;

        len属性:表示SDS保存字符串的长度;

        buf[]属性:用于保存字符串(数组的最后一个字节则保存了空字符'\0',且这空字符不计算SDS的len属性里面)。

3. SDS的好处:

        降低获取字符串长度的复杂度(0(n)-->o(1)),确保获取字符串长度工作不会成为Redis的性能瓶颈。

        杜绝缓冲区溢出,例如SDS在使用sdscat函数(拼接操作)时,首先后检查SDS的空间是否足够,不够先扩展空间,然后在拼接。

        减少修改字符串时带来的内存重分片次数,通过未使用空间(即free属性记录的长度),SDS实现了空间预分配和惰性空间释放两种优化策略。

4. 空间预分配公式:

        SDS长度(len属性的值,单位:字节)小于1MB时,程序分配len属性同样大小的free属性的未使用空间。

        SDS长度大于1MB时,程序分配1MB的未使用空间。

5. 惰性空间释放:

        当SDS缩短保存的字符串时,程序并不立即使用内存重分配来回收缩短后多出来的字节,而使用free属性将这些字节的数量记录起来,并且等待将来使用。

6. Redis二进制安全:

        SDS的API都是二进制安全的(binary-safe),所有SDS API都会以二进制的方式处理SDS存放在buf数组里的数据,程序不会对其中的数据做任何限制、过滤、或假设,数据写入时是什么样的,取读还是什么样的。

7. 兼容部分C语言字符串函数,实现复用。

8. C字符串与SDS之间的区别:

9. SDS API:

第 3 章 链表

1. 链表节点结构:

2. 链表结构:

3. Redis的链表实现的特性总结:

  • 双端:链表节点带有prev和next指针,获取某个节点的 前置节点和后置节点的复杂度都是O(1)
  • 无环:表头节点的prev指针和表尾节点的next指针都指向NULL,对链表的访问以NULL为终点。
  • 带表头指针和表尾指针:通过list结构的head指针和tail指针,程序获取链表的表头节点和表尾节点的复杂度为O(1)
  • 带链表长度计数器:list结构的len属性来对list持有的链表节点进行计数,程序获取链表节点数量的复杂度为O(1)
  • 多态:链表节点使用void*指针来保存节点值,并且可以通过list结构的dup、free、match三个属性来为节点值设置类型特定函数,所以链表可以用于保存各种不同类型的值

4. 链表和链表节点的API:

        见书籍P21

5. 链表被广泛用于实现Redis的各种功能,比如列表键、发布与订阅、慢查询、监视器等。

第 4 章 字典

1. 概念:

        字典,又称为符号表(symbol table)、关联数组(associative array)或映射(map),是一种用于保存键值对(key - value pair)的抽象数据结构;

        并且字典中每一个键都是独一无二的;

        Redis的数据库就是使用字典来作为底层实现的,对数据库的增删查改操作是构建在对字典的操作之上的;

        字典还是哈希键的底层实现之一。

2. 字典的实现:

字典使用哈希表作为底层实现,一个哈希表里面有多个哈希节点,每个哈希节点就保存了字典中的一个键值对。

3. 哈希表结构:

table属性是一个数组,数组中的每一个元素都是指向dict.h/dictEntry结构的指针,每个dictEntry结构保存着一个键值对。

4. 哈希表节点结构:

        next属性指向另一个哈希表节点的指针,这个指针可以将多个哈希值相同的键值对链接在一起,以此解决键冲突的问题。

5. 字典结构:

type属性和 privata属性是针对不同类型的键值对,为创建多态字典而设置的。

        type属性:是一个指向dictType结构的指针,dictType结构中保存了用于操作特定类型键值对的函数, Redis会为不同的字典设置不同的类型特定函数。

        privata属性:保存了类型特定函数的可选参数。

        ht属性:包含两个项的数组,数组中的每个项都是一个dictht哈希表,一般情况下,字典只使用ht[0]哈希表,ht[1]哈希表只会在对ht[0]哈希表进行rehash时使用。

        dictType结构:

        字典数据结构:

6. Redis的哈希表解决键值冲突方法:

        使用链地址法(就是散列表)来解决键值冲突,每个哈希节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链表,被分配到同一个索引上的多个节点可以用单向链表链接起来,这就解决了键冲突的问题。

7. 拓展和收缩哈希表的工作可以通过执行rehash操作重新完成,简单来说:对ht[0]所有的键值对进行重新计算哈希值和索引值,再把它们放入ht[1]中。

8. 当以下条件中的任意一个被满足时,程序会自动开始对哈希表执行扩展操作:

  • 服务器目前没有在执行BGSAVE命令或者BGREWRITEAOF命令,并且哈希表的负载因子大于等于1。
  • 服务器目前正在执行BGSAVE命令或者BGREWRITEAOF命令,并且哈希表的负载因子大于等于5。
  • 其中哈希表的负载因子可以通过公式:

        负載因子=哈希表已保存节点数量/哈希表大小

        load factor =ht[0].. used/ ht[0]. size

9. 当哈希表的负载因子小于0.1时,程序自动开始对哈希表执行收缩操作。

10. 渐进式rehash:

        为了避免rehash对服务器性能造成影响,服务器不是一次性将ht[0]里面的所有键值对全部rehash到ht[1],而是分多次,渐进式地将ht[0]里面的键值对慢慢地rehash到ht[1]。简单来说:每次只处理ht[0]哈希表中,一个索引值上所有的键值对。每次处理的时机是在对字典的添加或删除或查找或更新操作时,附带执行。

11. 渐进式rehash执行期间:

  • 查询操作:程序先在ht[0]里面进行查找,如果没有再继续到ht[1]里面进行查找。
  • 添加操作:直接添加到ht[1]中。

12. 字典API:

见书籍P36

第 5 章 跳跃表

11. 概念:

  • 跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。
  • 跳跃表支持平局O(logN)、最坏O(N)复杂度的节点查找,还可以通过顺序性操作批量处理节点。
  • Redis使用跳跃表的两个地方:有序集合和集群节点中用作内部数据结构。

2. 跳跃表数据结构:

        Redis跳跃表由zskiplistNode(用于表示跳跃表节点)和zskiplist(用于保存跳跃表节点的相关信息)两个结构定义。

  • zskiplistNode:标记节点的各个层。后退指针(BW):当前节点的前一个节点,后退指针在程序从表尾向表头遍历时使用;分值(score):节点所保存的分值,在跳跃表中,节点按各自所保存的分值从大到小排列;成员对象(obj):节点保存的成员对象。

  • zskipList:header:指向跳跃表的表头节点;tail:指向跳跃表的表尾节点;level:记录目前跳跃表内,最大层数节点的层数(表头节点的层数不计算在内);length:记录跳跃表的长度,即,跳跃表目前包含的节点数据量。

3. 其他:

  • 每个跳跃表节点层高都是1至32之间的随机数。
  • 在同一个跳跃表中,多个节点可以包含相同的分值,但是每个节点的对象必须是唯一的。
  • 跳跃表中的节点按照分值大小进行排序,当分值相同时,节点按照成员对象的大小进行排序。

第 6 章 整数集合

1. 概念:

  • 整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值的元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。
  • 它可以保存类型为int16_t、int32_t或者int64_t的整数值,并且保证集合中不会出现重复元素。

2. 数据结构:

3. 升级(upgrade):

  • 概念:新增一个元素到整数集合里面,并且新元素的类型比现有整数集合所有元素的类型都要长时,整数集合需要先升级,然后能将新元素添加到整数集合里面。
  • 步骤:1)根据新元素的类型,扩展整数集合底层数组的空间大小,并为新元素分配空间;2)将底层数组现有的所有元素都转换成与新元素相同的类型,并将类型转换后的元素放到正确的位置上,而且在放置元素的过程中,需要继续维持底层数组的有序性质不变;3)将新元素添加到底层数组里面。
  • 好处:提升灵活、节约空间。

3. 降级:整数集合不支持降级操作,一旦对数组升级,编码就会一直保持升级后的状态。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SQL Server数据库】熟悉DBMS的基本操作及数据库的创建

目录 一、SQL SERVER基本操作 二、用Management Studio创建数据库 1、使用Management Studio创建数据库bookdb,各项参数采用默认设置。 2、使用Management Studio创建数据库EDUC 3. 在EDUC中创建三个表,根据下面要求创建Student,Course&am…

C语言 | Leetcode C语言题解之第190题颠倒二进制位

题目: 题解: const uint32_t M1 0x55555555; // 01010101010101010101010101010101 const uint32_t M2 0x33333333; // 00110011001100110011001100110011 const uint32_t M4 0x0f0f0f0f; // 00001111000011110000111100001111 const uint32_t M8…

django学习入门系列之第三点《小米商城头标总结》

文章目录 总结往期回顾 总结 body标签,默认有一个边框,造成页面四边都有白色的间距,那该如何去除呢? body{margin: 0; }文本居中 文本水平居中,文本会在这个区域中居中text-align作为HTML元素属性其主要是用来文本水平居中的。 &…

一键模板生成视频解决方案,海量模板,满足多样需求

视频已经成为企业营销、宣传、培训的重要手段,高昂的制作成本、复杂的技术门槛以及繁琐的制作流程,往往让许多企业望而却步。美摄科技凭借其深厚的技术积累和创新能力,推出了面向企业的智能一键模板生成视频解决方案,为企业视频制…

电梯开关状态人员进出检测数据集VOC+YOLO格式2220张4类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2220 标注数量(xml文件个数):2220 标注数量(txt文件个数):2220 标注…

50KW-2500KW水冷式负载组概述

对于需要“针落”安静操作的环境,EAK 负载组为传统风冷装置提供了极具吸引力的替代方案。 该系列负载组是水冷的,允许在受控环境中进行室内安装,而不是在室外安装,因为室外设备暴露在元素中。除了完全相当之外,还非常紧…

Github2024-06-25 Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-25统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10TypeScript项目1系统设计指南 创建周期:2507 天开发语言:Python协议类型:OtherStar数量:241693 个Fork数量:42010 次关注人数…

图解布隆过滤器(Bloom Filter)

布隆过滤器详解 布隆过滤器(Bloom Filter)是一种空间效率非常高的随机数据结构,由布隆(Burton Howard Bloom)在1970年提出,用于检验一个元素是否属于一个集合。 具体来说,它可能会错误地认为一个…

2024CICE电博会·以“链主”企业为核心,推动产业链协同发展

随着全球科技日新月异的发展,消费电子产业已成为推动经济增长、改善人民生活的重要力量。中国国际消费电子博览会(简称CICE电博会)自2001年创办以来,已经走过了二十余个春秋,凭借其独特的地理位置优势、专业的组织策划…

MYSQL九、MYSQL的视图的认识

视图 视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在。行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。 视图只保存了查询的SQL逻辑,不保存查询结果。在创建视图的时候,…

Delphi-2M:基于病史预测未来健康的改进GPT架构

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

一份日本 AWS Summit 的前线快报

5月底刚参加完 AWS 中国 Summit「这次的上海 AWS Summit 好玩的有点过分」,后来网翻官不经意间看到 6 月 AWS 还会在日本举办一场 Summit。正好最近公司也签下了几个日本客户,眼看着 5 年签证也即将到期,于是心一横,决定东渡扶桑。…

快速上手 Spring Boot:基础使用详解

快速上手 Spring Boot:基础使用详解 文章目录 快速上手 Spring Boot:基础使用详解1、什么是SpringBoot2、Springboot快速入门搭建3、SpringBoot起步依赖4、SpringBoot自动配置:以tomcat启动为例5、SpringBoot基础配置6、yaml7、多环境开发配置…

移动硬盘恢复数据要多久 4T移动硬盘数据恢复一般多少钱

在日常工作中,移动硬盘是非常实用的一种数据文件存储设备,在大数据存储上是有极强的优势的,不过移动硬盘有时候也会出现数据丢失的情况。接下来给大家详细讲解,移动硬盘恢复数据要多久,以及4T移动硬盘数据恢复一般多少…

当你在浏览器输入一个地址

你在浏览器中输出了一个地址,回车后,一直到显示页面,中间经历了哪些过程 ? 1. 用户输入 URL 并按下回车 用户在浏览器的地址栏中输入一个 URL(例如 http://example.com)并按下回车键。 2. DNS 解析 浏览…

【机器学习】自然语言处理(NLP)领域革命性突破的模型——Transformer

目录 引言 自注意力机制介绍 生成Query、Key和Value向量 模型结构与实现 在自然语言处理中的应用 个人主页:东洛的克莱斯韦克-CSDN博客 👀引言 👀在自然语言处理领域,传统的循环神经网络和长短时记忆网络虽然取得了一定的成…

linux 登录ftp报Received message too long 1416128883

在linux 登录ftp报Received message too long 1416128883 [rootlocalhost ~]# sftp oaftp172.20.xx.xx解决办法: [rootlocalhost ~]# usermod -s /bin/bash oaftp[rootlocalhost ~]# systemctl restart vsftpd.service[rootlocalhost ~]# sftp oaftp172.20.xx.xx完…

【TB作品】stm32单片机,红外遥控器,温控风扇,模拟空调,PWM风扇

空调机 硬件:stm32、oled显示器、ds18b20温度传感器、风扇驱动和风扇、红外接收器、遥控器 软件功能: (1)显示室内温度 (2)显示当前模式:常态、除湿、通风 (3)显示当前风…

昇思25天学习打卡营第6天 | 函数式自动微分

神经网络的训练主要使用反向传播算法, 模型预测值(logits)与正确标签(label)送入损失函数(loss function)获得loss, 然后进行反向传播计算,求得梯度(gradie…

Kubernetes 中 ElasticSearch 中的 MinIO 审核日志

无论您是在本地还是在云中,您都希望确保以同构的方式设置工具和流程。无论在何处访问基础结构,您都希望确保用于与各种基础结构进行交互的工具与其他区域相似。 考虑到这一点,在部署您自己的 MinIO 对象存储基础架构时,深入了解您…