Redis基本数据结构及底层实现
redis 所有值对象在内部都定义为 redisObject
typedef struct redisObject{
//类型
unsigned type:4; //0.5byte
//编码
unsigned encoding:4;//0.5byte
//指向底层数据结构的指针
void *ptr;//8byte
//引用计数器
int refCount;//4byte
//最后一次的访问时间
unsigned lru://3byte
}//16byte
redis字符串对象(SDS)
struct sdshdr{
//记录buf数组中已使用字节的长度
int len;//4byte
//记录buf数组中剩余空间的长度
int free;//4byte
//字节数组,用于存储字符串
char buf[];//'\0'占1byte
};
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 encoding 键值)
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

浙公网安备 33010602011771号