1、Redis底层数据结构
1.1 Redis实现K,V键值对
首先Redis是K,V键值对,对用户来说,最外层就是简单的K - V,这种类似于HashMap的键值对对应关系
其中K和V都指向RedisObj,而K只能指向String的RedisObj
而RedisObj就是从用户来看的Zset,String,Hash、Set,List的最顶层
然后RedisObj的结构如下
typedef struct redisObject{
unsigned type; // 表明他是什么类型
unsigned encoding; // 实 际的存储编码格式,具体的数据结构
unsigned lru: // 用于lru算法
int ref; // 引用次数
void *ptr // 指向对象实际的数据结构
} robj;
1.2 String
SDS
struct{
len; // 长度
alloc; // 分配的空间
flags; // sds的类型(sdshdr8 sdshdr16 sdshdr32 sdshdr64)
buf[]; //字符串
}
之所以搞SDS,是因为C语言的字符串实现不足
- 获取长度复杂度O(N)
- 因为 '\0' 作结尾的缘故,C语言必须保存文本,不支持二进制
- 容易内存溢出
而通过SDS
- len字段提供了O(1)复杂度
- 因为len + buf指定了长度,对存储限制就不限制在文本了
- 由于alloc已经是分配的空间,通过alloc - len找到剩余可用空间,就可以快速判断剩余空间是否可用,防止了内存溢出
- 并且还会额外分配一些未使用空间,减少内存分配次数
- 实际上的sds类型,采用的是结构体优化对齐,即选择的是指针碰撞,不会按照字节分配地址,占多少空间给多少空间
sds的类型是sdshdr8 sdshdr16 sdshdr32 sdshdr64
Sting的编码格式
- int
- embstr
- raw
- Redis-String的内存结构