redis自学(11)ZSet
ZSet也就是SortedSet,其中每一个元素都需要制定一个score值和member值:
- 可以根据score值排序
- member必须唯一
- 可以根据member查询分数
因此,zset底层数据结构必须满足键值存储、键必须唯一、可排序这几个需求。之前学习的那种编码结构可以满足?
- SkipList:可以排序,并且可以同时存储score和ele值(member),但是它无法满足根据member查询分数和键必须唯一的条件。
- HT(Dict):可以键值存储,并且可以根据key找value,但是不能可排序
内存结构:
当元素数量不多时,HT和SkipList的优势不明显,而且更耗内存。因此zset还会采用ZipList结构来节省内存,不过需要同时满足两个条件:
① 元素数量小于zset_max_ziplist_entries,默认值128
② 每个元素都小于zset_max_ziplist_value字节,默认值64
编码转换:
ZipList如何能做到键值对和排序的需求的呢?
ziplist本身没有排序功能,而且没有键值对的概念,因此需要zset通过编码实现:
- ZipList是连续内存,因此score和element是紧挨在一起的两个entry,element在前,score在后
- score越小越接近队首,score越大越接近队尾,按照score值升序安排
内存图:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步