首页 > 中间件 > redis对象的编码格式

redis对象的编码格式

作者:bin
目录
[隐藏]

redis的对象如图包含:对象类型、编码格式、指向底层实现数据的指针

不同的对象类型,对应不同的底层数据编码格式

string对应:int、embstr、row

set对应:intset、hashtable

list对应:ziplist、linklist

hash对应:ziplist、hashtable

zset对应:ziplist、skiplist

string对象

int:如果设置的值是整数值,那么他会用long来保存:

set data 100
object encoding data 
"int"

embstr:如果字符串长度小于32个字节,那么就会用embstr来保存,这种结构简单一些,无序指向底层数据结构的指针,是一段连续的内存包含redisObject和sds字符串,优点是少了一次内存分配和释放

set data"nihao"
object encoding data 
"embstr"

raw:如果字符串长度大于32,或者对embstr编码格式对字符做了修改(embstr不支持修改),就会变成row。

set data"nihao"
append data "shijie"
object encoding data 
"raw"

set对象

intset,当set里面只有整数时,那么就会用intset的编码格式,数据都放在一个整数集合里面,出现如下情况会转换为hashtable
1.出现了非整数值
2.数组长度大于512

sadd data 1 2 3
object encoding data 
"intset"

hashtable,使用字典dict作为底层实现,字典里面包含,rehashindex和数组,数组里包含2个dictht,dictht的属性包含一个数组、表大小、已用容量、sizemask掩码,数组中的每个节点dictEntry,包含key,value,和next指针。

//插入长度大于64字节的value,迫使由ziplist转为hashtable
hset data "zengbingo_zengbingo_zengbingo_zengbingo_zengbingo_zengbingo_zengbingo"
object encoding data 
"hashtable"

rehash过程

hash对象

hashtable,参考set中一样的

ziplist,压缩表是一段连续的内存
zltypes,保存的是占了多少内存。
zltail,保存的是到尾部指针的长度,可以用于定位最后一个节点entry
zllen,保存节点数量
entry对象中,保存着前一个节点的长度,这样可以从后部遍历时,直接推出前一个entry的位置。

list对象

ziplist参考hash对象即可

linklist,底层编码是一个list对象,对象包含head节点,tail节点和链表长度

zset对象

ziplist参考hash对象即可

skiplist,是一个多层链表,zskiplist对象,包含head,tail,len,level(最高层级),每个node都包含一个数组表示层级、后退指针、score分数、对象指向,层级数组中的对象包含2属性,1个是指针node指针,1个是跨度。单独拿0层和后退指针来看就是一个双向链表。

您必须 [ 登录 ] 才能发表留言!