Redis数据结构学习 - String | 青训营笔记

131 阅读1分钟

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的内存结构 Redis-String的内存结构.png