redis底层数据结构
2021-12-22 14:10:32 0 举报
redis底层数据结构
作者其他创作
大纲/内容
len5
dictEntry*[4]
0
1
2
3
4
5
6
7
8
9
10
11
表1 不同类型和编码的对象
StringObject\"cherry\"
StringObject\"apple\"
StringObject\"banana\"
dictEntry
't'
'h'
'r'
'e'
'\\0'
list链表(adlist.h/list)
listNode *head(表头节点)
listNode *tail(表尾节点)
unsigned long len(节点数量)
void *(*dup) (void *ptr)(节点复制函数)
void *(*free) (void *ptr)(节点值释放函数)
uint32_t zlbytes
uint32_t zltail
uint16_t zllen
entryX
uint8_t zlend
占用字节数,重分配和计算zlend的位置时使用
表尾节点距离起始地址的字节数
节点数量,大于65535时,需要遍历整个表
节点,长度由节点决定
0xff,结束标志
链表
k1
v1
redisObject对象(ziplist编码的有序集合对象)
typeREDIS_ZSET
encodingREDIS_ENCODING_ZIPLIST
ptr
...
redisObject对象(ram编码的字符串对象)
tyypeREDIS_STRING
encodingREDIS_ENCODING_RAM
NULL
L32
L5
L4
L3
L2
L1
StringObject\"age\"
intset整数集合(inset.h/intset)
uint32_t *encoding(编码方式)
uint32_t length(元素数量)
int8_t contents[](保存元素的数组)
free0
集合对象set
HSET profile name \"Tom\" age 25 career \"Programmer\"
sdshdr
表1 对象的类型
StringObject5
redisObject对象(hashtable编码的集合对象)
typeREDIS_SET
encodingREDIS_ENCODING_HT
zlbytes
zltail
zllen
“name”
“Tom”
\"age\"
25
\"career\"
\"Programmer\"
zlend
db[0]
db[1]
db[2]
db[15]
有序集合对象zset
long long
13858776000000
6.0
dict
ht[0]
StringObject“three”
dictEntry(embstr编码的字符串对象)
'L'
'o'
'n'
'g'
'k'
'i'
''
'.'
5.0
BW
StringObject\"Tom\"
'l'
typeREDIS_STRING
encodingREDIS_ENCODING_EMNSTR
SDS简单动态字符串(sds.h/sdshdr)
int *len(字符串长度,数组使用数量)
int *len(buf数组未使用字节的数量)
char buf[](字节数组,用于保存字符串)
zset
zskiplist *zsl(跳跃表)
dict *dict(字典)
哈希对象hash
buf
redisObject对象(inset编码的集合对象)
encodingREDIS_ENCODING_INTSET
previous_entry_length
encoding
content
1字节或者5字节
数据类型以及长度,00、01、10是字节数组,11是整数
节点值,字节数组或者整数
header
tail
level5
length3
RPUSH numbers 1 \"three\" 5
adshdr
len37
redisObject对象(ziplist编码的列表对象)
typeREDIS_LIST
StringObject1
字典(dict.h/dict)
dictType *type(类型特定函数)
void *privdata(私有数据)
dictht ht[2](哈希表)
int trehashidx(rehash索引)
8.5
redisObject对象(hashtable编码的哈希对象)
typeREDIS_HASH
“three”
redis底层数据结构
StringObject\"alphabet\"
StringObject\"book\"
StringObject\"message\"
ht[1]
StringObject\"Programmer\"
\"banana\"
\"cherry\"
\"apple\"
编码常量
编码对应的底层数据结构
REDIS_ENCODING_INT
long类型的樟整数
REDIS_ENCODING_EMBSTR
embster编码的简单动态字符串
REDIS_ENCODING_RAM
简单动态字符串
REDIS_ENCODING_HT
字典
REDIS_ENCODING_LINKEDLIST
双端链表
REDIS_ENCODING_ZIPLIST
压缩列表
REDIS_ENCODING_INTSET
整数结合
REDIS_ENCODING_SKIPLIST
跳跃表和字典
10086
listNode链表节点(adlist.h/list)
struct listNode *prev(前置节点)
struct listNode *next(后置节点)
void *value(节点的值)
redisk客户端状态(resdis.h/redisClient)
redisDb *db
rehash
redis服务器状态(resdis.h/redisServer)
//...
redisDb *db(数组,保存所有数据库)
int dbnum(服务器的数据库数量,默认16)
// ...
dictht
table
表2 对象的编码
redisObject对象(ziplist编码的哈希对象)
inset
encodingINTSET_ENC_INT16
Length3
contents
列表对象list
dictType
//计算哈希值的函数unsigned int (*hashFunction)(const void *key);
字符串对象string
redisObject对象(int编码的字符串对象)
encodingREDIS_ENCODING_INT
redisObject对象
unsigned tyype:4(类型)
unsigned encoding:4(编码)
void *ptr(指向底层实现数据结构的指针)
键空间和用户所见的数据库是直接对应的:1、键空间的键也就是数据库的键,每个键都是一个字符串对象。2、键空间的值也就是数据库的值,每个值可以是字符串对象、列表对象、哈希表对象、集合对象和有序集合对象中的任意一种Redis对象。
dictEntry哈希表节点(dict.h/dictEntry)
void *key(键)
union{ void *val; uint64_tu64; int64_ts64; } v; (值)
struct dictEntry *next(下个节点,形成链表)
类型
编码
对象
REDIS_STRING
使用整数值实现的字符串对象
使用embstr编码的简单动态字符串实现的字符串对象
使用简单动态字符串实现的字符串对象
REDIS_LIST
使用压缩列表实现的列表对象
使用双端链表实现的列表对象
REDIS_HASH
使用压缩列表实现的哈希对象
使用字典实现的哈希对象
REDIS_SET
使用整数集合实现的集合对象
使用字典实现的集合对象
REDIS_ZSET
使用压缩列表实现的有序集合对象
使用跳跃表和字典实现的有序集合对象
类型常量
对象的名称
字符串对象
列表对象
哈希对象
结合对象
有序结合对象
redis服务器(resdis.h/redisDb)
dict *dict(数据库键空间,保存所有键值对)
dict *expires(过期字典,过期时间)
dictht哈希表(dict.h/dictht)
dictEntry **table(哈希表数组)
unsigned long size(哈希表大小)
unsigned long sizemask(大小掩码,计算索引,size-1)
unsigned long used已有节点数量
StringObject\"career\"
StringObject\"name\"
收藏
0 条评论
回复 删除
下一页