【问题标题】:Most efficient way to insert an already sorted set into REDIS将已排序的集合插入 REDIS 的最有效方法
【发布时间】:2015-04-14 11:04:41
【问题描述】:

我在内存中有一个已经排序的大小 (N) 的集合,并且想将其转储到 redis 中,如果先插入头部或尾部,是否可以在 O(N) 中完成?或者没关系,插入will be O(log(N!)) ~ O(N log(N))

有关更多详细信息,redis 排序集是使用哈希图和跳过列表(用于排序)实现的。

编辑:这个问题一直没有答案,或者至少答案对我来说有点模棱两可:Redis: Is ZADD better than O(logN) when the inserted element is at the beginning or end?

【问题讨论】:

  • IMO 没关系
  • 我不熟悉skiplists,但对于其他有序的数据结构(如树),如果您以特定顺序插入,您确实会得到一个log(N)...并且来自wikipedia article on skip -lists 似乎确实有可能获得 O(N) 但 REDIS 实现是否相同?
  • 有趣的问题...我将尝试进行基准测试,看看是否可以发现任何经验差异。另一种方法是阅读源代码:github.com/antirez/redis :)
  • 我尝试阅读源代码,但 20 分钟后绝望了……抱歉。不过没有考虑过基准测试。
  • 现在有了赏金,我真的很有动力:P

标签: redis time-complexity sortedset skip-lists


【解决方案1】:

在对另一种经验方法中采用的方法产生怀疑后,我进行了自己的插入基准测试(所有集合在时间插入之前初始化,对于随机插入测试,元组列表在开始计时之前被打乱),如下所示结果:

对于具有 2k、20k 和 200k 成员的有序集:

  • 头部优先:196.29s | 1146.43s | 9897.29s
  • 尾先:170.14s | 993.43s | 9722.14s
  • 和插入:146.00s | 1014.57s | 9968.57s

所有变量都具有足够的可变性(标准开发者分别为 7.8 | 54.5 | 324.5),因此差异不足以得出结论。好像没关系……:(

【讨论】:

  • 没有什么比把锤子敲到岩石上然后开始敲打它更好的了 :)
  • 是的...好吧,我现在很想找到一个金块... :S 我不相信自己胜过相信你。所以我还是有疑问的。问题是噪音太大,REDIS太快,网络接口太慢。
  • > REDIS 太快了
  • 是的,这也是我们使用它的原因:p
【解决方案2】:

这是来自我的"empirical" approach 的结果,这表明订购可能会有一点好处:)

(.venv)foo@bar:~/so_bounty$ python main.py
ascending order
5.57414388657
descending order
5.72963309288
random order
6.75937390327
0 score
5.79048109055

【讨论】:

  • 您能详细说明您的模拟中使用的方法吗?迭代次数、数据集大小等。谢谢!
  • 代码的链接在答案中 (gist.github.com/itamarhaber/6c9f3dd75ec5e25d8044) - 我使用了 10,000 的集合大小,并在笔记本电脑上的 VM 中进行了 100 次迭代 - YMMV :)
  • Dam... 尝试在 java 中复制实验,但没有得出确凿的结果(使用不同的集合大小,1k、10k 和 100k)。这不可能是任何愚蠢的错误,比如在 python 中获取随机数只是需要更长的时间来计算,所以随机集的构建速度会更慢吗?
  • 可能会犯很多愚蠢的错误——我现在每天都在犯这些错误;)——但我相信我通过在插入时间之前准备好这一套来避免这种情况。
  • 好吧,因为没有人查看源代码来寻找答案,所以你得到了赏金。享受吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 2012-05-16
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
相关资源
最近更新 更多