ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2022-02-28 22:03:58  阅读:139  来源: 互联网

标签:struct int max ziplist Redis unsigned 字节 数据结构 底层


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有