Redis 中的 zset(有序集合)是一种基于哈希表和跳跃表实现的有序数据结构。
在内部实现上,zset 由两个数据结构组成:
- 哈希表(Hash Table):用于存储元素和元素对应的分值(score),其中元素作为键,分值作为值。因为哈希表可以提供 的查找、插入和删除操作,所以它被用来实现元素的查找和删除操作。
- 跳跃表(Skip List):用于存储有序的元素,其中每个节点都包含一个元素和元素对应的分值。跳跃表通过每个节点的 forward 指针连接起来,形成一个多层的、有序的链表。跳跃表的插入、删除和查找操作的时间复杂度均为 ,因此它被用来实现有序集合的有序性和范围查找操作。
zset 的元素按照分值从小到大排序,如果分值相同,则按照元素的字典序进行排序。当有多个元素的分值相同时,Redis 将会比较它们的元素,如果元素也相同,则认为这些元素是同一个,仅保存一个。
zset 的主要操作包括:
- 添加元素:可以添加一个元素和它对应的分值,或者多个元素和它们对应的分值。
- 删除元素:可以根据元素的值删除一个或多个元素。
- 修改分值:可以修改元素的分值。
- 查找元素:可以根据元素的值查找它的分值,或者根据范围查找元素。范围查找操作可以使用分值的范围或字典序的范围来指定。