Redis底层数据结构

一、简单动态字符串SDS

1、结构

struct sdshdr {
    int len;       // 记录数组中已使用的字节数
    int free;      // 记录数组中未使用的字节数
    char buf[];    // 用于保存字符串
}

2、特点

(1)获取字符串长度复杂度O(1)

(2)防止缓冲区溢出

(3)减少修改字符串长度时所需的内存重分配次数

(4)二进制安全

(5)兼容部分C字符串函数 

 

二、链表

1、结构

// 链表节点
typedef struct listNode {
    struct listNode *prev;    // 前置节点
    struct listNode *next;    // 后置节点
    void *value;              // 节点值
} listNode;

// 链表
typedef struct list {
    listNode *head;                          // 表头结点
    listNode *tail;                          // 表尾节点
    unsigned long len;                       // 链表节点数
    void *(*dup) (void *ptr);                // 节点值复制函数
    void (*free) (void *ptr);                // 节点值释放函数
    int (*match) (void *ptr, void *key);    // 节点值对比函数
} list;

2、特点

(1)双端无环链表

(2)快速获取表头、表尾指针

(3)快速获取链表长度

(4)多态,可存储各种类型数据

 

三、字典

1、结构

// 哈希表节点
typedef struct dictEntry {
    void *key;                 // 键
    union {                    // 值
        void *val;
        uint64_t u64;
        int64_t s64;
    } v;
    struct dictEntry *next;    // 指向下一个节点
} dictEntry;

// 哈希表
typedef struct dictht {
    dictEntry **table;         // 哈希表数组
    unsigned long size;        // 哈希表大小
    unsigned long sizemask;    // 哈希表大小掩码,总是等于size-1
    unsigned long used;        // 已有节点数量
} dictht;

// 字典
typedef struct dict {
    dictType *type;    // 类型特定函数
    void *privdata;    // 私有数据
    dictht ht[2];      // 哈希表,ht[1]用于rehash过程
    int trehashidx;    // rehash索引,当rehash不再进行时为-1
} dict;

2、特点

(1)两个哈希表用于快速rehash过程

(2)链地址表法解决hash冲突

(3)渐进式rehash 

 

四、跳跃表

1、结构

// 跳跃表节点
typedef struct zskiplistNode {
    struct zskiplistNode *backward;       // 后退节点
    double score;                         // 分值
    robj *obj;                            // 成员对象
    struct zskiplistLevel {
        struct zskiplistNode *forward;    // 前驱节点
        unsigned int span;                // 跨度
    } level[];
} zskiplistNode;

// 跳跃表
typedef struct zskiplist {
    struct skiplistNode *header, *tail;    // 表头和表尾节点
    unsigned long length;                  // 跳跃表长度
    int level;                             // 最大层数
}

 2、特点

(1)层高为1-32之间的随机数

(2)分值允许相同,当分值相同时,按照成员对象的大小进行排序

 

五、整数集合

1、结构

// 整数集合
typedef struct intset {
    uint32_t encoding;    // 编码方式
    uint32_t length;      // 集合包含的元素数量
    int8_t contents[];    // 元素数组
} intset;

 2、特点

(1)升级策略,提升整数集合的灵活性,尽可能节约内存。

(2)整数集合有序、无重复

 

六、压缩列表

1、结构

typedef struct zlentry {
    unsigned int prevrawlensize;    // 前驱节点的编码长度
    unsigned int prevrawlen;        // 前驱节点类型
    unsigned int lensize;           // 节点类型/长度
    unsigned int len;               // 节点试集长度
    unsigned int headersize;        // prevrawlensize + lensize
    unsigned char encoding;         // 节点类型
    unsigned char *p;               // 节点开头
} zlentry;

2、特点

(1)顺序性数据结构,底层由char数组构成

(2)可包含多个节点,每个节点可以保存一个字节数组或整数值

(3)添加或删除节点可能会引发连锁更新操作 

 

七、对象

1、结构

typedef struct redisObject {
    unsigned type:4;          // 类型
    unsigned encoding:4;      // 编码
    unsigned lru:LRU_BITS;    // LRU时间或LFU数据
    int refcount;
    void *ptr;                // 只想底层数据结构的指针
} robj;

2、对象类型和编码

类型编码对象条件
REDIS_STRINGREDIS_ENCODING_INT字符串对象(整数值)保存整数值,且可以用long来表示
REDIS_STRINGREDIS_ENCODING_EMBSTR字符串对象(embstr编码的SDS)保存字符串值,且长度小于等于39字节
REDIS_STRINGREDIS_ENCODING_RAW字符串对象(SDS)其它
REDIS_LISTREDIS_ENCODING_ZIPLIST列表对象(压缩列表)保存的所有字符串元素长度都小于64字节,且元素数量小于512个
REDIS_LISTREDIS_ENCODING_LINKEDLIST列表对象(双端链表)其它
REDIS_HASHREDIS_ENCODING_ZIPLIST哈希对象(压缩列表)保存的所有键值对的键和值的字符串长度都小于64字节,且键值对数量小于512个
REDIS_HASHREDIS_ENCODING_HT哈希对象(字典)其它
REDIS_SETREDIS_ENCODING_INTSET集合对象(整数集合)保存的所有元素都是整数值,且元素数量小于512个
REDIS_SETREDIS_ENCODING_HT集合对象(字典)其它
REDIS_ZSETREDIS_ENCODING_ZIPLIST有序集合对象(压缩列表)保存的元素数量小于128个,且成员长度都小于64字节
REDIS_ZSETREDIS_ENCODING_SKIPLIST有序集合对象(跳跃表)其它

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值