回顾redis底层数据结构
参考,欢迎点击原文:https://blog.csdn.net/qq_38286618/article/details/102530020
https://www.cnblogs.com/jaycekon/p/6277653.html
提示:本文谨作知识梳理
前言
因为最近时期有必要好好回顾下各块知识,然后看到redis这块发现按照现在的工作年限不能再像之前一样只知道几种基本类型就行了,需要深耕一下了,记录如下
众所周知redis有5种基本类型:string,list,set,zset,hash
接下来我们需要进一步深扒这5种基本类型低层是什么样的数据结构,这样的结构有啥好处。
一、string
基于简单动态字符串simple dynamic string SDS(不是ssd)
该结构对象里有三个主要属性:
int len;// 已使用长度
int free;// 未使用长度
char bugf[];// 使用的“数组”空间
有以上三个属性,当需要拓展空间时会预估空间然后分配内存,这样避免了缓冲区溢出做到了对空间动态释放和扩容。
二、list
1、基于双向链表实现,该结构属性如下
listNode * head;// 表头节点
listNode * tail;// 表尾节点
unsigned long len; // 链表长度
void *(*dup) (void *ptr);// 节点值复制函数
void (*free) (void *ptr);// 节点值释放函数
int (*match)(void *ptr, void *key);// 节点值对比函数
2、基于压缩列表实现
每个节点node里面存储了如value值,前后指针等信息。当list元素个数少且元素内容长度不大时,使用压缩列表实现
链表特点:有序,可存多个相同值,非连续内存空间,使用指针前后相连
三、set
1、基于字典,也就是hash表实现,实质是个map映射关系。该结构属性如下
dictEntry **table;//哈希表数组
unsigned long size;//哈希表大小
unsigned long sizemask;//哈希表大小掩码,用于计算索引值
unsigned long used;//该哈希表已有节点的数量
2、如果都是整数,使用整数集合。
tip:如果遇到hash冲突,使用头插法插入到hash表的节点中
四、zset
1、基于跳跃表skiplist,跳跃表实际是一个有节点的有序链表,里面每个节点中维持多个指向其他节点的指针,相当于二分查找
2、数据量不大基于压缩列表
五、hash
基于压缩列表和字典