redis 是 内存数据库,支持持久化 有rdb和aof两种方式进行持久化,单进程单线程运行,读性能达到11w次/秒,写性能达到8w1次/s;也是key value存储,类型包括字符串、列表、整型、hash表、字典;
内部数据结构
字符串 用 sds 表示 typedef char *sds; 表头为sdshdr 其中有成员 int len 已经使用长度 int free 还有可用的长度 char buf[] 分配的数据 是个柔性数组;
双端链表 查找头节点和尾结点、长度都是常数性能, 定义了节点、迭代器和表list;
定义节点 typedef struct listNode {
struct listNode *pre;
struct listNode *next;
void *value;
}listNode;
定义迭代器
typedef struct listIter{
listNode* next;
int direction;
}listIter;
定义表头
typedef struct list{
listNode *head;
listNode *tail;
void *(*dup)(void *ptr);
void *(*free) (void *ptr);
void *(*match)(void *ptr);
unsigned long len;
}list;
字典
定义 哈希表节点
typedef struct dictEntry{
void *key; key 值
union{
void *val;
uint64_t u64;
int64_t s64;
double d;
}v; val值
struct dictEntry *next;
}dictEntry;
哈希表结构 typedef struct dictht{
dictEntry **table; 存放数组地址,数组中存放节点的地址
unsigned long size; hash表的大小,初始化为4
unsigned long sizemask; 用于将hash值映射到table的位置索引 值为size-1
unsigned long used; 记录已使用的节点数量
}dictht;
定义 dictType 结构来定义不同类型的key value 的方法
typedef struct dictType{
uint64_t (*hashFunction)(const void* key); 计算哈希值的函数
void *(*keyDup)(void *privdata ,const void *key); key复制
void *(*valDup)(void *privdata,const void *obj); value值复制
int (*keCompare) (void privdata,const void *key1,const void *keyd2); key值比较函数
void (*keyDestuctor)(void *privdata,void *key); key销毁函数
void(*valDestructor)(void *privdata,void *obj); value销毁函数
}dictType;
字典结构:
typedef struct dict{
dictType *type; 定义不同类型的操作函数
void *privdata; dict的私有变量
dictht ht[2]; 哈希表数组 正常情况只使用 ht[0],rehash的时候使用ht[1]
long rehashidx; 该值为-1 表示正常,否则在rehash过程中
unsigned long iterators; 正在运行迭代器的数量
}dict;
迭代器
typedef struct dictIterator{
dict *d; 迭代器指向的字典
long *index; 所指的哈希表索引位置
int table,safe; table 正在迭代的哈希表号码 ht[0] 或 ht[1];safe表示迭代器是否安全
dictEntry *entry,*nextEntry; 当前节点 和下一个
long long fingerprint; 指纹标记 避免不安全迭代器
}dictIterator;
跳跃表 实现有序集合 zset
typedef struct redisObject {
unsigned type:4; unsigned encoding:4 ;表示类型和编码
unsigned lru :REDIS_LRU_BITS;
int refcount; 引用计数 用来记录使用的个数,当为0 时 自动析构
void *ptr; 指向的结构
}robj;
typedef struct zskiplistNode{
robj *obj; 对象
double score; 分数
struct zskiplistNode *backward; 后退指针
stuct zskiplistLevel {
struct zskiplistNode *forward; 前进指针
unsigned int span; 这层跨越的节点数量
}level[]; 层级 柔性数组
}zskiplistNode;
typedef struct zskiplist{
struct zskiplistNode *head,*tail; 头尾两个节点
unsigned long length ; 跳跃表的长度或跳跃表节点数量计数器,除去第一个节点
int level; 跳跃表中节点的最大层数,除了第一个节点
}zskiplist;
typedef stuct zset{
dict *dict;
zskiplist *zsl;
}zset;