数据库
首页 > 数据库> > Redis基本数据结构及底层实现

Redis基本数据结构及底层实现

作者:互联网

redis 所有值对象在内部都定义为 redisObject

typedef struct redisObject{
//类型
unsigned type:4;
//编码
unsigned encoding:4;
//指向底层数据结构的指针
void *ptr;
//引用计数器
int refCount;
//最后一次的访问时间
unsigned lru:
}

 

redis字符串对象(SDS)

struct sdshdr{
//记录buf数组中已使用字节的长度
int len;
//记录buf数组中剩余空间的长度
int free;
//字节数组,用于存储字符串
char buf[];
};

  

intset

typedef struct intset{
//编码方式
uint32_t encoding;
//元素数量
uint32_t length;
//存储元素的数组
int8_t contents[];
}

  

 

ziplist

type struct ziplist{
//整个压缩列表的字节数
uint32_t zlbytes;
//记录压缩列表尾节点到头结点的字节数,直接可以求节点的地址
uint32_t zltail_offset;
//记录了节点数,有多种类型,默认如下
uint16_t zllength;
//节点
列表节点 entryX;

  

 

 

 

 

 

linkedlist

type struct list{
//表头节点
listNode *head;
//表尾节点
listNode *tail;
//包含的节点总数
unsigned long len;
//一些操作函数 dup free match...
};

  

hashtable

typedef struct dictht{
//哈希表数组
dictEntry **table;
//哈希表大小
unsigned long size;
//哈希表掩码,总是等于size-1,存储时计算索引值
unsigned long sizemask;
//已有元素数量
unsigned long used;
}

  

skiplist

typedef struct zskiplistNode {
//层
struct zskiplistLevel {
//前进指针
struct zskiplistNode *forward;
//跨度
unsigned int span;
} level[];

//后退指针
struct zskiplistNode *backward;
//分值
double score;
//成员对象
robj *obj;
} zskiplistNode;

typedef struct zskiplist {
//头结点
zskiplistNode *head;
//尾节点
zskiplistNode *tail;
//当前最大层高
int maxLevel;
//跳表长度
int length;
//跳表中的所有键值对
map<String,zskiplistNode*> ht;
}

  

 

 

 

一、字符串(string 最大512M) 

内部编码:(查看内部编码命令 object encode 键值)

int:8个字节的长整形

embstr:小于等于某个值(39个)字节的字符串

raw:大于某个值(39个)字节的字符串

二、哈希(hash)

内部编码:

ziplist:当元素个数小于某个值(hash-max-ziplist-entries 默认512),同时每个元素占用内存都小于某个值(hash-max-ziplist-value 默认64字节)redis使用ziplist节省内存

hashtable:不满足ziplist的条件就用hashtable

三、列表(list)

内部编码:

ziplist:当元素个数小于某个值(list-max-ziplist-entries 默认512),同时每个元素占用内存都小于某个值(list-max-ziplist-value 默认64字节)redis使用ziplist节省内存

linkedlist:不满足ziplist的条件就用hashtable

四、集合(set)

内部编码:

intset:当集合中的元素都是整数且元素个数小于某个值(set-max-intset-entries 默认512)时 ,使用intset节省内存

hashtable:不满足intset的条件就用hashtable

五、有序集合(zset)

内部编码:

ziplist:当元素个数小于某个值(zset-max-ziplist-entries 默认128),同时每个元素占用内存都小于某个值(zset-max-ziplist-value 默认64字节)redis使用ziplist节省内存

skiplist:不满足ziplist的条件就用skiplist

 

标签:struct,int,max,ziplist,Redis,unsigned,字节,数据结构,底层
来源: https://www.cnblogs.com/bucthuge/p/15947785.html