1.zset结构
1.redisObject对象详解
type:类型4bit得具体类型,String,list,set,hash,zset等;为啥用4bit?因为4bit可以有16中类型,目前redis还暂未支持这莫多类型。
encoding:底层存储结构,4bit;比如hash结构,压缩表结构;
LRU_BITS:24位得LRU时间
ptr:指针 8byte 64位 指向具体得数据;特殊说明:只有string类型得embstr中ptr指针为空,其他得均有值
refCount:引用次数,4byte 32位
2.zset结构详解
两部分组成,一部分存储数据dict结构(这个也是redis得结构),另外一部分分为zipList或者是zskipList
2.1 zipList结构
![](https://img-blog.csdnimg.cn/70f68408f7774d59834aeefda33e172a.png)
当 ziplist 作为 zset 的底层存储结构时,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素值,第二个元素保存元素的分值,而且分值小的靠近表头,大的靠近表尾
有序集合对象使用 ziplist 存储需要同时满足以下两个条件,不满足任意一条件将使用 skiplist
(1)所有元素长度小于64 (server.zset_max_ziplist_value配置)字节
(2)元素个数小于128 (server.zset-max-ziplist-entries配置)
2.2 zskipList结构
head:头节点,指向
tail:尾节点
level:层级
length:长度
2.3zskipListNode结构
head和tail指向得结构
几个参数:
score:分数值
obj:具体对象值
backward:后退指针
zskipLevel level[]:层级数据
2.4 zskipLevel结构
zskipListNode节点 forward 前进指针
span:跨度
3.zset跳表中数据如何处理得?(面试问过)
简单可以理解成为翻硬币,如果一直为正,接着投,知道反面;
int randomlevel() {
//初始化为一级索引
int level = 1;
//翻硬币,如果求余2等于1 则 level增加一层
while( rand() % 2 ) level++;
//如果level 没有超过最大层数就返回,否则就返回最大层数
level = ( maxlevel > level ) ? level : maxlevel;
return level;
}
新插入得数据,进行随机分层,知道%2为1情况下,进行层数返回;最大层数为5层。