一、简单动态字符串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_STRING | REDIS_ENCODING_INT | 字符串对象(整数值) | 保存整数值,且可以用long来表示 |
REDIS_STRING | REDIS_ENCODING_EMBSTR | 字符串对象(embstr编码的SDS) | 保存字符串值,且长度小于等于39字节 |
REDIS_STRING | REDIS_ENCODING_RAW | 字符串对象(SDS) | 其它 |
REDIS_LIST | REDIS_ENCODING_ZIPLIST | 列表对象(压缩列表) | 保存的所有字符串元素长度都小于64字节,且元素数量小于512个 |
REDIS_LIST | REDIS_ENCODING_LINKEDLIST | 列表对象(双端链表) | 其它 |
REDIS_HASH | REDIS_ENCODING_ZIPLIST | 哈希对象(压缩列表) | 保存的所有键值对的键和值的字符串长度都小于64字节,且键值对数量小于512个 |
REDIS_HASH | REDIS_ENCODING_HT | 哈希对象(字典) | 其它 |
REDIS_SET | REDIS_ENCODING_INTSET | 集合对象(整数集合) | 保存的所有元素都是整数值,且元素数量小于512个 |
REDIS_SET | REDIS_ENCODING_HT | 集合对象(字典) | 其它 |
REDIS_ZSET | REDIS_ENCODING_ZIPLIST | 有序集合对象(压缩列表) | 保存的元素数量小于128个,且成员长度都小于64字节 |
REDIS_ZSET | REDIS_ENCODING_SKIPLIST | 有序集合对象(跳跃表) | 其它 |