【问题标题】:Why Redis SortedSet uses Skip List instead of Balanced Tree?为什么 Redis SortedSet 使用 Skip List 而不是 Balanced Tree?
【发布时间】:2017-12-20 06:25:48
【问题描述】:

Redis 文档如下:

ZSET 是使用两种数据结构来保存相同元素的有序集合 为了得到 O(log(N)) INSERT 和 REMOVE 操作进入排序 数据结构。

元素被添加到一个哈希表中,将 Redis 对象映射到 分数。同时将元素添加到跳过列表 将分数映射到 Redis 对象(因此对象按分数排序) 这个“观点”)。

我不太明白。谁能给我详细的解释?

【问题讨论】:

  • 找出这些天结构提供的利弊,也许你能回答你自己的问题。

标签: data-structures redis sortedset skip-lists


【解决方案1】:

Antirez 说,见https://news.ycombinator.com/item?id=1171423

有几个原因:

  • 它们不是很占用内存。这基本上取决于你。更改有关节点具有给定数量级别的概率的参数将比 btree 占用更少的内存。
  • 排序集通常是许多 ZRANGE 或 ZREVRANGE 操作的目标,即作为链表遍历跳过列表。使用此操作,跳过列表的缓存局部性至少与其他类型的平衡树一样好。
  • 它们更易于实现、调试等。例如,由于跳过列表的简单性,我收到了一个补丁(已经在 Redis 主服务器中),其中增加了在 O(log(N)) 中实现 ZRANK 的跳过列表。它只需要对代码进行少量更改。

关于 Append Only 的持久性和速度,我认为以更多代码和更复杂的用例为代价优化 Redis 不是一个好主意,恕我直言,对于 Redis 目标(fsync() 在每个命令)。即使对于 ACID SQL 数据库,几乎没有人使用此功能,因为无论如何性能提示很大。

关于线程:我们的经验表明,Redis 主要受 I/O 限制。我正在使用线程从虚拟内存中提供服务。利用所有核心的长期解决方案,假设您的链接速度如此之快以至于您可以使单个核心饱和,运行多个 Redis 实例(无锁,几乎完全与核心数量线性扩展),并使用“Redis Cluster " 我计划在未来开发的解决方案。

【讨论】:

    【解决方案2】:

    首先,我想我明白了 Redis 文档所说的内容。 Redis有序集通过用户指定的元素分数来维护元素的顺序。但是当用户使用一些 Redis Zset API 时,它只给出元素参数。例如:

    ZREM key member [member ...]
    ZINCRBY key increment member
    ...
    

    redis 需要知道这个成员(元素)的值是什么,所以它使用哈希表维护一个映射,就像文档说的:

    元素被添加到一个哈希表中,将 Redis 对象映射到 分数。

    当它接收到一个成员时,它通过哈希表找到它的值,然后对跳过列表进行操作,以保持集合的顺序。 redis 使用两种数据结构来维护双重映射,以满足不同 API 的需要。

    我阅读了 William Pugh 的论文 跳过列表:概率 替代平衡树,发现跳过列表非常优雅,比旋转更容易实现。

    另外,我认为一般的二叉平衡树能够以相同的时间成本完成这项工作。我想我错过了什么,请指出。

    【讨论】:

    • 您错过了检索跳过列表中的第 n 个项目是 O(log(n)) 而在平衡树中是 O(n) 的点。它对于 ZRANK 或 ZRANGE 命令非常有用。
    • 感谢您的帮助。我认为如果我们维护平衡树中每个节点的值 children_count,我们可以在 bt 中获得 O(log(n)) 中的第 n 个项目
    • @DidierSpezia 为什么在平衡树中接收第 n 个项目是 O(n) 操作?难道这棵树不能设计成 Order Statistic Tree(每个节点都知道它的左右子树的大小),这样找到第 n 项就变成 O(logn) 了吗?
    • @DidierSpezia 和 ZREVRANGE 在 rb tr 中也不容易实现
    猜你喜欢
    • 2012-09-22
    • 2016-08-13
    • 2013-03-15
    • 1970-01-01
    • 2010-10-04
    • 2012-04-08
    • 2021-09-21
    • 1970-01-01
    • 2014-09-12
    相关资源
    最近更新 更多