ZSet 也就是 SortedSet ,其中每一个元素需要指定一个 score 值和一个 member 值:
1.可以根据 score 值进行排序
2.member 值必须唯一
3.可以根据 member 查询分数
因此 ZSet 底层数据结构必须满足键值存储,键必须唯一,可排序这几个需求
1.SkipList:可以排序,并且可以同时存储 score 和 member 值
2.Dict:可以键值存储,并且可以根据 key 查询 value
ZSet底层结构如下:
当元素数量不多时,Dict 和 SkipList 的优势并不明显,而且更耗内存。因此 ZSet 还会采用 ZipList 结构来节省内存,不过需要同时满足两个条件
1.元素数量小于 zset_max_ziplist_entries,默认为 128
2.每个元素都小于 zset_max_ziplist_value字节,默认为 64
ziplist 本身没有排序功能,而且没有键值对存储的概念,因此需要 zset 通过编码实现:
1.ZipList 是连续内存,因此 score 和member 是紧挨在一起的两个 entry , member 在前,score 在后
2.score 越小越接近队首,score 越大越接近队尾,按照 score 升序排列
使用ziplist的ZSet结构如下: