redis zset结构详解

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结构
      

       当 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层。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值