redis sortset 是如何实现的

fiy 其他 14

回复

共3条回复 我来回复
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Redis的有序集合(Sort Set)是一种特殊的数据结构,它使用一个浮点数或者整数(score)与一个成员(member)关联。有序集合的特点是成员是唯一的,但是score可以重复。

    实现有序集合主要依赖于跳跃表(Skip List)和哈希表(Hash Table)两种数据结构。

    1. 跳跃表(Skip List):
      跳跃表是一种自平衡的有序链表,它的查找效率高于普通的链表。Redis的有序集合使用跳跃表来存储成员和score的对应关系,其中每个节点包含了成员和score的信息,并且以升序排列。

    2. 哈希表(Hash Table):
      Redis使用哈希表来实现Jump-Nodes(跳跃表的节点),它通过哈希表来快速定位到每个节点。哈希表的每个桶中存放着一个节点,通过节点的指针链接方式构成了跳跃表的结构。

    3. 索引更新:
      当有新成员添加进有序集合时,会根据成员的score在跳跃表中找到对应的位置插入。如果插入的score已经存在,则更新对应的成员的score值。同时,需要在哈希表中保存成员和score的对应关系。

    4. 排序:
      有序集合的排序是根据score进行的,可以根据score的值进行升序或者降序排序。

    5. 范围查找:
      有序集合支持按照score范围进行查找,可以在跳跃表中通过score范围直接定位到对应的节点。

    6. 成员查找:
      有序集合支持根据成员进行查找,底层还是通过跳跃表和哈希表的结构实现。

    总结:
    Redis的有序集合实现主要依赖于跳跃表和哈希表两种数据结构,跳跃表提供了高效的插入、删除和范围查找功能,而哈希表则提供了快速的定位操作。有序集合充分利用了这两种数据结构的优点,实现了高效的成员排序和范围查找功能。

    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Redis的有序集合(Sorted Set)是一种数据结构,它是由一个非重复元素的集合,每个元素都关联着一个浮点数的分数。这个分数用来对集合中的元素进行排序,从而使得有序集合的元素是有序的。

    Redis的有序集合使用了跳跃表(Skip List)和哈希表(Hash Table)两种数据结构来实现。

    1. 跳跃表是一种有序链表,它通过在每个节点中维护一个指向其他节点的指针,从而避免了在有序链表中进行线性搜索。这样可以提高查询效率,使得有序集合的添加、删除和查找操作都能够在对数时间内完成。

    2. 跳跃表中的每个节点都包含一个分数和一个成员。分数用于对元素进行排序,成员则用于存储具体的数据。跳跃表中的节点按照分数从小到大的顺序进行排序,相同分数的节点则按照成员的字典序进行排序。

    3. 跳跃表是多层的,每一层都是一个有序链表。每个节点都包含一个前进指针,指向下一层中相同的节点。这样可以在搜索和插入时跳过一些节点,从而提高效率。

    4. 哈希表用于保存每个成员在跳跃表中的位置。它通过使用成员作为键,位置作为值,将成员和位置进行映射。这样可以通过成员快速查找到它在跳跃表中的位置,从而减少搜索的时间。

    5. Redis还使用了一个字典来保存有序集合的成员和分数,这样可以通过成员快速查找到它的分数。

    总结起来,Redis的有序集合通过使用跳跃表和哈希表两种数据结构,以及字典来实现。跳跃表提供了有序集合的排序功能,并通过多层结构和前进指针,提高了查询效率。哈希表用于保存成员在跳跃表中的位置,从而快速定位和查找成员。字典用于存储成员和分数的映射关系,以便快速检索和更新成员的分数。这样就实现了高效的有序集合数据结构。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Redis中的Sorted Set(有序集合)是一种特殊的数据结构,它提供了有序的集合和增删改查操作。Sorted Set中每个成员都对应一个分数(score),通过分数进行排序。在Redis中,Sorted Set是通过跳表(Skip List)和哈希表(Hash Table)两种数据结构来实现的。

    Redis的Sorted Set内部存储是由跳表和哈希表结合完成的。

    跳表

    跳表是一种实现有序集合的数据结构,它通过构建多层链表来加速元素的查找。每一层链表中的节点包含一个指向同层下一个节点的指针,同时也包含一个指向下一层的指针。这样,通过比较节点的值,跳表可以快速定位到目标节点。

    在Redis中,Sorted Set使用的跳表结构是一种不完全的跳表,即只有头节点的前两层指针。头节点(header)由一个无穷小的值作为分数,指向第一层的第一个节点。每一层的节点都按照分数值的大小进行排序。

    跳表的优势是查询效率高,时间复杂度为O(logN)。但是,插入和删除元素的操作需要重新调整整个跳表的结构,因此时间复杂度为O(logN)。

    哈希表

    Redis中的跳表只存储了有序集合成员的元数据,而值数据则是存储在一个哈希表中。哈希表是通过哈希函数将键(key)映射为数据存储的位置,它是Redis中最常用的数据结构之一。

    在Sorted Set中,每个成员对应一个分数和一个值。这些成员的分数存储在跳表中,而值则存储在哈希表中。跳表中的每个节点都包含一个指向哈希表的指针,通过这个指针可以查找到对应的值。

    哈希表的优势是查询的时间复杂度为O(1),即常数时间。但是,哈希表对于有序的查询是无法实现的,因此需要跳表结构来实现成员的有序性。

    排序操作

    Sorted Set支持的操作主要包括插入成员、删除成员、修改成员的分数、根据分数范围获取成员、根据分数获取成员的排名等。

    对于插入操作,Sorted Set先在跳表中找到要插入位置的节点,然后将新节点插入到跳表中,并将对应的值存储在哈希表中。由于跳表必须保持有序性,插入新节点后需要进行调整。

    对于删除操作,Sorted Set先在跳表中找到要删除的节点,并将其从跳表中删除。然后,根据节点的指针找到对应的值,从哈希表中删除。

    对于修改分数的操作,Sorted Set只需要在跳表中找到对应的节点,并更新其分数即可。不需要修改哈希表中的值。

    对于根据分数范围获取成员的操作,Sorted Set使用跳表的特性,可以快速定位到分数范围的起始节点,并按顺序遍历跳表中的节点,获取符合条件的成员。

    对于根据分数获取成员的排名的操作,Sorted Set可以通过遍历跳表中的节点,统计每个节点前面的节点数,即可得到成员的排名。

    总结

    Redis的Sorted Set通过跳表和哈希表这两种数据结构实现了有序集合。跳表用来存储成员的分数和排序,哈希表用来存储成员的值。通过结合使用这两种数据结构,Sorted Set实现了高效的增删改查操作,并保持了成员的有序性。跳表提供了高效的查找和排序功能,而哈希表则提供了快速的查询操作。通过这种方式,Redis的Sorted Set能够在满足有序性的同时保持高效的性能。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部