原创

redis数据结构-五种数据类型-ZSet


ZSet也就是SortedSet,其中每一个元素都需要指定一个score值和member值:

  • 可以根据score值排序后
  • member必须唯一
  • 可以根据member查询分数

微信截图_20230211174410

因此,zset底层数据结构必须满足键值存储、键必须唯一、可排序这几个需求。在这里罗列一下skipList和HT

  • skipList:可以排序,并且可以同时存储score和ele值(member)
  • HT (Dict):可以键值存储,并且可以根据key找value

微信截图_20230211174410 - 副本

当元素数量不多时,HT和SkipList的优势不明显,而且更耗内存。因此zset还会采用ZipLit结构来节省内存,不过需要同时满足两个条件:

  1. 元素数量小于zset max ziplist entries,默认值128
  2. 每个元素都小于zset max ziplist value字节,默认值64

ZSet不满足上面的两个条件时的结构模型

微信截图_20230211174440

ZSet添加元素的时候添加的一个代码片段

微信截图_20230211175454

从上面的代码可以看出当zset_max_ziplist_value被设置为0的时候代表zipList被禁用了

当ZSet满足再到不满足上面两个条件时它会由ZipList转为SkipList和Dict,具体可以看他的插入方法

ZSet的插入方法

微信截图_20230211180005

ziplist本身没有排序功能,而且没有键值对的概念,因此需要有zset通过编码实现:

  • ZipList是连续内存,因此score和element是紧挨在一起的两个entry,element在前,score在后
  • score越小越接近队首,score越大越接近队尾,按照score值升序排列

微信截图_20230211215724

redis原理
数据结构
  • 作者:陌攻(联系作者)
  • 发表时间:2023-02-13 02:53
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码
  • 评论