「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战」
一些问题:
-
怎么实现双向? 我们使用遍历的方法找到指定位置,然后因为每个压缩表节点存放了前一个节点的长度,那么我们就能够往前找元素.
-
怎么实现从头或者从尾巴插入数据?ziplist存放了zltail,表示最后一个数据在什么位置上,那么我们就能在尾巴上插入数据.
-
为么数据元素变多或者变大,就不用ziplist了?因为他还是使用遍历的手段,但数据量大的时候,效率是不高的.另外他插入元素的时候,过程是进行内存拷贝的,但数据量大的时候,效率不高
-
优点是什么?占用内存小,是一整块内存,不会有内存碎片问题.
-
redis的zset(sort set)
-
zset的编码可以是ziplist或者是skiplist。同时满足以下条件时使用ziplist编码 :下面的具体限制数字都是可以在配置文件中更改的
- 元素数量小于128个
- 所有menber长度都小于64字节
-
redis的skiplistNode是存放key(score)和value(menber)的,但是实现上不是放在一起的,是同时包含一个字段dict和skiplist的,skiplist就是score的多层链表,dict就存放menber值,和skiplist的score有对应关系,这样查找score是O(logN),找对应的menber就只是O(1)。因此也可以有重复的score,就不会想hash表一样。
-
skipList的随机数是<0.25; 最高层限制是32层
-
有了上面的预备知识我们可以知道下面命令的过程:
- zscore 是查询menber的score是由dict来提供。但是如果是ziplist怎么办呢?他的key value是连在一起的,因此得到key的位置以后,下一个就是value
- zrange 是查询就是差skiplist
- zrank 是查询menber的排名,那么就是先去dict,然后再去skiplist
-