ZSet(Sorted Set)是Redis中的一种特殊数据结构,内部维护了一个有序字典,其中每个元素都包含成员(member)和double类型的分值(score)。这种结构非常适合实现排行榜功能,如游戏积分榜或网站热度排名。
ZSet实现
Redis的ZSet实现经历了多次演进:
- 早期采用ziplist(压缩列表)和skiplist(跳跃表)两种结构
- Redis 5.0引入listpack(紧凑列表)取代ziplist
- Redis 7.0起完全移除了ziplist
在SkipList 的这种实现还会用dict(字典)
跳表用于维护有序集合,根据元素分值进行排序存储。这种结构支持 O(log n) 时间复杂度的插入、删除和查找操作,确保了高效的有序访问性能。
字典则建立了元素到分值的快速映射关系,以元素为键、分值为值。借助哈希表的特性,字典实现了 O(1) 时间复杂度的各项操作,提供了极高的查询效率。
ZSet的存储机制
ZSet的存储机制会根据数据规模自动调整:
- 元素较少时使用ListPack(原ZipList)节约内存
- 元素增多后自动转换为SkipList以保持有序性和高效范围查询 转换过程会遍历ListPack中的所有元素,