关于redis的基本数据结构总结

前言

本文是总结 详细请看下列:

(数据结构与数据类型区别_数据类型和数据结构的区别_IT技术学习的博客-CSDN博客

图解redis的压缩列表_编程界的谢菲尔德的博客-CSDN博客

(283条消息) 图解redis之整数集合_编程界的谢菲尔德的博客-CSDN博客

(283条消息) 图解redis的跳跃表_编程界的谢菲尔德的博客-CSDN博客

(283条消息) 图解redis的字典_编程界的谢菲尔德的博客-CSDN博客

(283条消息) 图解redis之链表的实现_编程界的谢菲尔德的博客-CSDN博客

(283条消息) redis之动态字符串sds的实现_编程界的谢菲尔德的博客-CSDN博客

引言

数据结构

什么是结构

结构是指在一个系统或者材料之中,互相关联的元素的排列、组织。结构按类别可分为等级结构
(有层次的一对多)、网格结构(多对多)、晶格结构(临近的个体互相连接)等。

什么是数据结构

相互之间存在一种或多种特定关系数据元素的集合,包括逻辑结构和物理结构。定义了计算机存储、组织数据的方式

逻辑结构

逻辑结构是指数据元素之间的逻辑关系,它独立于数据在计算机的存储方式,可以看作是从具体问题抽象出来的数学模型

逻辑结构又分为:线性结构(有且只有一个开始结点和终端结点;所有结点最多只有一个直接前驱和一个直接后继),非线性结构(对应于线性结构,非线性结构每个结点可以有不止一个直接前驱和直接后继)

线性结构:数组、链表、栈、队列 …
非线性结构:集合、树、图…

在这里插入图片描述

 在这里插入图片描述

物理结构

物理结构也称存储结构,是逻辑结构用计算机语言的实现,它依赖于计算机语言。
数据的存储结构主要有:顺序存储、链式存储、索引存储、散列存储。
在具体实现存储时,可以选择在内存里开辟连续内存空间或不连续的内存空间,也可以混搭成更复杂的存储方式

在这里插入图片描述

 顺序存储:存储的物理位置通常情况是连续分布的
链接存储:存储的物理位置未必连续,看实现方式,通过记录相邻元素的物理位置来找到相邻元素
索引存储:类似于树状目录,存储形式看实现方式
散列存储:通过关键字直接计算出元素的物理地址。存储形式看实现方式

数据类型

数据结构:相互之间存在一种或多种特定关系的数据元素的集合,包括逻辑结构和物理结构
数据类型:一个值的集合以及定义在这个值集合上的一组操作(增删改查读写…)的总称

数据类型和数据结构其实是所属关系

据类型有两种,是按照定义中“值的集合”来区分的。一、“值的集合”是数据结构,“数据结构”的集合和在该集合上的一组操作叫做结构类型。二、“值的集合”是基本的原子类型(int、double、char、byte、boolean、指针类型、空类型 …)再加上在该值集合上的操作就是原子类型

总之,数据结构是一种“值的集合”,这种值的集合+值集合上的操作 = 结构类型,而结构类型是数据类型中的一种。

在这里插入图片描述

 举例redis

string(字符串)

redis的string数据类型由SDS数据结构+API组成

1)常数复杂度获取字符串长度。0(1)

存在一个len的结构成员

2)杜绝缓冲区溢出。

当SDS API需要对SDS进行修改时,API会先检查SDS的空间 是否满足修改所需的要求,如果不满足的话,API会自动将SDS的空间 扩展至执行修改所需的大小,然后才执行实际的修改操作,所以使用 SDS既不需要手动修改SDS的空间大小

3)减少修改字符串长度时所需的内存重分配次数。

1.空间预分配

如果对SDS进行修改之后,SDS的长度(也即是len属性的值)将 小于1MB,那么程序分配和len属性同样大小的未使用空间,这时SDS len属性的值将和free属性的值相同。

举个例子,如果进行修改之后, SDS的len将变成13字节,那么程序也会分配13字节的未使用空间,SDS 的buf数组的实际长度将变成13+13+1=27字节(额外的一字节用于保存 空字符)。

·如果对SDS进行修改之后,SDS的长度将大于等于1MB,那么程序 会分配1MB的未使用空间。举个例子,如果进行修改之后,SDS的len将 变成30MB,那么程序会分配1MB的未使用空间,SDS的buf数组的实际 长度将为30MB+1MB+1byte

4)二进制安全。

通过len来判断 是否完结 杜绝“/0"的可能

5)兼容部分C字符串函数

hash(哈希)

hash=字典+压缩列表+API

字典重点:

字典被广泛用于实现Redis的各种功能,其中包括数据库和哈希键。 ·

Redis中的字典使用哈希表作为底层实现,每个字典带有两个哈希 表,一个平时使用,另一个仅在进行rehash时使用。

·当字典被用作数据库的底层实现,或者哈希键的底层实现时, Redis使用MurmurHash2算法来计算键的哈希值。

·哈希表使用链地址法来解决键冲突,被分配到同一个索引上的多个键值对会连接成一个单向链表。 

在对哈希表进行扩展或者收缩操作时,程序需要将现有哈希表包 含的所有键值对rehash到新哈希表里面,并且这个rehash过程并不是一 次性地完成的,而是渐进式地完成的。

压缩列表:

压缩列表是一种为节约内存而开发的顺序型数据结构。

·压缩列表被用作列表键和哈希键的底层实现之一。

·压缩列表可以包含多个节点,每个节点可以保存一个字节数组或 者整数值。

·添加新节点到压缩列表,或者从压缩列表中删除节点,可能会引 发连锁更新操作,但这种操作出现的几率并不高

list(列表)

list=list+ziplist

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

·每个链表节点由一个listNode结构来表示,每个节点都有一个指向 前置节点和后置节点的指针,所以Redis的链表实现是双端链表。

·每个链表使用一个list结构来表示,这个结构带有表头节点指针、 表尾节点指针,以及链表长度等信息。

·因为链表表头节点的前置节点和表尾节点的后置节点都指向 NULL,所以Redis的链表实现是无环链表。

·通过为链表设置不同的类型特定函数,Redis的链表可以用于保存 各种不同类型的值

set(集合)

set=整数集合+API

整数集合是集合键的底层实现之一。

·整数集合的底层实现为数组,这个数组以有序、无重复的方式保 存集合元素,在有需要时,程序会根据新添加元素的类型,改变这个数 组的类型。

·升级操作为整数集合带来了操作上的灵活性,并且尽可能地节约 了内存。 ·整数集合只支持升级操作,不支持降级操作。

sort set (有序集合)

sortset=跳跃表+API

跳跃表

·跳跃表是有序集合的底层实现之一。

·Redis的跳跃表实现由zskiplist和zskiplistNode两个结构组成,其中 zskiplist用于保存跳跃表信息(比如表头节点、表尾节点、长度),而 zskiplistNode则用于表示跳跃表节点。

·每个跳跃表节点的层高都是1至32之间的随机数。

·在同一个跳跃表中,多个节点可以包含相同的分值,但每个节点 的成员对象必须是唯一的。 ·跳跃表中的节点按照分值大小进行排序,当分值相同时,节点按 照成员对象的大小进行排序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值