今天是周末,但是也要继续学习,加油,今天想总结一下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赶路人”,让我们一起开始新的征程,求职之路,加油!