redis学习总结-- 内部数据 字符串 链表 字典 跳跃表

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;

你可能感兴趣的:(redis)