对象总览—第二回

今天是周末,但是也要继续学习,加油,今天想总结一下Redis用到的数据结构,对它们各自的结构,做一个简要的概括:

1.简单动态字符串(SDS):由sdshdr组成

每个sdshdr结构表示一个SDS值,sdshdr结构有3个属性,分别为:

int类型的len,记录SDS所保存的字符串的长度

int类型的free,记录buffer数组中未使用字节的数量

char类型的数组(字节数组)buf[],用于保存字符串

 

2.双端链表:由list和listNode组成

(1)每个链表节点使用一个listNode结构来表示,包含有3个属性,分别为:

前置节点prev

后置节点next

节点的值value

(2)链表用list来表示,有6个属性,分别为:

表头节点head

表尾节点tail

链表所包含的节点数量len

节点值复制函数dup

节点值释放函数free

节点值对比函数match

 

3.字典(符号表,关联数组,映射)由dict,dictht和dictEntry组成

(1)Redis中的字典由dict结构表示,有4个属性,分别为:

类型特定函数type:type是一个指向dictType结构的指针,每个dictType结构保存了特定的函数

void类型的privdata:保存了需要传给特定函数的参数

dictht类型的哈希表ht:是一个包含两个项的数组,每个项都是一个dictht哈希表

int类型的rehashidx:和rehash有关的属性,记录了rehash目前的进度

(2)dictType结构,有6个函数:

计算哈希值的函数hashFunction

复制键的函数keyDup

复制值的函数valDup

对比键的函数keyCompare

销毁键的函数keyDestructor

销毁值的函数valDestructor

(3)哈希表由dictht结构定义,有4个属性,分别为:

dictEntry类型的数组table:数组中每一个元素都是指向dictEntry结构的一个指针,每个dictEntry结构保存着一个键值对

size属性:保存哈希表的大小,也就是table数组的大小

sizemask属性:总是等于size的大小减1(size-1)

used属性:记录已有节点的数量

(4)哈希表节点用dictEntry节点来表示,有3个属性,分别为:

key属性:保存着键值对的键

v属性:保存着键值对的值

next属性:指向另一个哈希表的指针,可以将多个哈希值相同的指针连在一起,以此来解决键冲突的问题

 

4.跳跃表:由zskiplist和zskiplistNode组成

(1)zskiplist结构用来保存跳跃表节点的相关信息,包含4个属性,分别为:

header属性:指向跳跃表的表头节点

tail属性:指向跳跃表的表尾节点

level属性:记录目前跳跃表内层数最大的那个节点的层数(表头节点不算)

length属性:记录跳跃表的长度,也就是,跳跃表目前的节点的数量

(2)zskiplistNode结构用来表示跳跃表节点,有4个属性,分别为:

后退指针backward:用于从表尾向表头访问节点

分值score:是一个double类型的浮点数,用来从大到小排列节点的顺序

成员对象obj:是一个指针,指向一个字符串对象,保存着一个SDS值

zskiplistLevel属性:该数组可以包含多个元素,用来存储层,每个元素都包含一个指向其他节点的指针,程序可以通过这些指针来加快访问其他节点的速度

(3)zskiplistLevel数组,有两个属性:

前进指针forward:每个层都有一个指向表尾方向的指针,用来从表头向表尾访问节点

int类型的span:跨度,用来记录两个节点之间的距离

 

5.整数集合(intset):由intset组成

每个intset结构表示一个整数集合,包含3个属性,分别为:

编码方式encoding:表示什么类型的数组

length属性:集合包含元素的数量

数组contents[]:保存元素的数组

 

6.压缩列表(ziplist):由一系列特殊编码的连续内存块组成的顺序型数据结构

以下是组成部分,包含5个属性,分别为:

zlbytes属性:记录压缩列表占用的内存字节数

zltail属性:记录压缩列表表尾节点距离起始地址有多少字节

zllen属性:记录压缩列表包含的节点数量

entryX属性:压缩列表的各个节点,可以任意多个节点

zlend属性:用于标记压缩列表的末端

 

以上便是Redis主要用到的几种数据结构的构成,看来要好好记住了才行!

2019.3.3

我是赶路人,有目前一起学习Redis的小伙伴吗,欢迎关注“WeAre赶路人”,让我们一起开始新的征程,求职之路,加油!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章