redis Zset的一些小计

Zset的底层实现原理以及用途

Zset的底层使用的是ziplist和skipList两种数据结构,

ziplist的官方解释:

The ziplist is a specially encoded dually linked list that is designed to be very memory efficient. 
It stores both strings and integer values, where integers are encoded as actual integers instead of a series of characters.
It allows push and pop operations on either side of the list in O(1) time.

翻译之后的意思是:

Ziplist 是一个特殊编码的双向链表,它的设计非常节省内存。它同时存储字符串和整数值,其中整数被编码为实际的整数,而不是一系列的字符。它允许在 o (1)时间内在列表的任何一边执行 push 和 pop 操作。

Ziplist在使用的时候满足两个要求:

  • 有序集合保存的元素数量小于128个
  • 有序集合保存的所有元素的长度小于64字节

Zset的底层结构

一个ziplist整体占用一大块内存。它是一个表(list),但其实不是一个链表。
ziplist的数据结构如下:

各个部分在内存上是前后相邻的,它们分别的含义如下:
: 32bit,表示ziplist占用的字节总数(也包括本身占用的4个字节)。
: 32bit,表示ziplist表中最后一项(entry)在ziplist中的偏移字节数。的存在,使得我们可以很方便地找到最后一项(不用遍历整个ziplist),从而可以在ziplist尾端快速地执行push或pop操作。
: 16bit, 表示ziplist中数据项(entry)的个数。zllen字段因为只有16bit,所以可以表达的最大值为216-1。这里需要特别注意的是,如果ziplist中数据项个数超过了16bit能表达的最大值,ziplist仍然可以来表示。那怎么表示呢?这里做了这样的规定:如果<zllen>小于等于216-2(也就是不等于2^16-1),那么就表示ziplist中数据项的个数;否则,也就是等于16bit全为1的情况,那么就不表示数据项个数了,这时候要想知道ziplist中数据项总数,那么必须对ziplist从头到尾遍历各个数据项,才能计数出来。
: 表示真正存放数据的数据项,长度不定。一个数据项(entry)也有它自己的内部结构,这个稍后再解释。
: ziplist最后1个字节,是一个结束标记,值固定等于255。
上面的定义中还值得注意的一点是:, , 既然占据多个字节,那么在存储的时候就有大端(big endian)和小端(little endian)的区别。ziplist采取的是小端模式来存储,这在下面我们介绍具体例子的时候还会再详细解释。

数据项的构成:

除此之外都是用skipList的数据结构

Zset是redis中基础存储类型之一,Zset只要是为了排行旁列表而使用的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值