redis数据结构
2017-04-01 本文已影响0人
c84f3109853b
SDS的定义
每个sds.h/sdshdr结构表示一个SDS值:
struct sdshdr {
// 记录buf数组中已使用字节的数量
// 等于SDS所保存字符串的长度
int len;// 记录buf数组中未使用字节的数量
int free;// 字节数组,用于保存字符串
char buf[];
};
优点:
- 常数复杂度获取字符串长度
- 杜绝缓冲区溢出
- 减少修改字符串时带来的内存重分配次数
- 实现了空间预分配和惰性空间释放
- 二进制安全
- 兼容部分C字符串函数
链表和链表节点的实现
每个链表节点使用一个adlist.h/listNode结构来表示:
typedef struct listNode {
// 前置节点
struct listNode *prev;
// 后置节点
struct listNode *next;
// 节点的值
void *value;
} listNode;
使用adlist.h/list来持有链表:
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;