redis底层数据结构
2023-01-10 16:40:45 0 举报
解剖redis的5种数据类型的底层数据结构
作者其他创作
大纲/内容
dictht
head
count
...
next
dictEntry数组
3.2版本之前LIST使用该结构
key
NULL
ZIPLIST(压缩列表)
null
unsigned long sizemask
zltail_offset
listNode
dictEntry
链表长度
ZIPLIST
val
entry
QUICKLIST(快速列表)
HT(字典)
type: 数据类型
EMBSTR(embstr编码的SDS)
。。。
refcount:被引用数量
STREAM
prev
大于44/39字节(3.2之前)
取其优点
整个列表占用字节数
节点值对比函数
encoding: 编码
zlend
content:int8_t[]
前一个节点长度
encoding:uint32_t
元素总数
alloc
INT(long类型的整数)
zl
最后一个元素偏移量,可通过它反向遍历
3.2版本后,LINKEDLIST + ZIPLIST结合,LINKEDLIST的每个元素是ZIPLIST
unsigned long used
entry结构
元素个数
compress
len
dict[0]
小于44/39字节(3.2之前)
unsigned long used
zlbytes
已分配的空间
tail
unsigned long size
flags
value
INTSET
unsigned long sizemask
Hash
节点值复制函数
编码类型:INTSET_ENC_INT16、INTSET_ENC_INT32、INTSET_ENC_INT64,根据元素选择最节省的类型,自动升级,不能降级
content
LINKEDLIST
....
SDS数据结构
LINKEDLIST底层结构
quicklistNode
redisObject 结构体
Set
free
字符串长度
结合HT一起
LISTPACK
扩容策略: 小于1M,双倍扩容,超过1M时,只分配多1M,避免浪费
实际数据
zllength
节点值释放函数
记录content的类型和长度
prelen
Zset
encoding
String
LINKEDLIST(双向链表)
ZIPLIST底层结构
存储元素值
dictEntry **table
为什么是44字节分界线:RedisObject占用16字节,SDS对象占用 capacity(字符串占用字节)+3,分配器最大1次分配 64字节,64-16-3-1(字符串结尾字符\\0) = 44
dict[1]
unsigned long size
match
QUICKLIST
节点压缩深度设置
dictEntry **table
当value为整数时
lru: 过期相关
实际字符串的值
dup
dictht ht[2]
SKIPLIST
*ptr: 指向底层数据结构
buf[]
QUICKLIST底层结构
区别: EMBSTR编码会将 RedisObject对象和SDS对象连续存储一起,只进行一个内存分配操作,而 raw 需要2次内存分配,地址一般不连续
RAW(简单的SDS)
SDS的类型,5种
length:uint32_t
List
集合的元素总数
收藏
0 条评论
下一页