2

有必要保留一个城市中排名前 10 位的列表,在任何给定的时刻,我们的食品服务需求都是从那里产生的。这座城市可能有数以万计的地方。如果必须在内存中创建一个近乎实时(延迟不超过 5 分钟)的数据存储,它将 - 按地区(地理哈希)计算传入的需求 - 每分钟读取数百个我们的供应商(ajax 刷新是每分钟)

我在想一个多线程同步的最大堆。这将是一个复杂的解决方案,因为树锁定本身就是一个复杂的实现。

对于可以在多线程环境中读取和更新的最佳内存(可复制主从)数据结构有什么建议吗?

我们预计每秒有 10K QPS 和 100K 更新。当我们扩展到其他城市和地区时,我们将需要每个城市实施前 10 名。

有现成的解决方案吗?

持久性不是必需的,因此没有基于 mySQL 的解决方案。如果您推荐 redis 或 mongo DB 解决方案,请注意查询不是按键指向的查询,而是 top-N 查询。

提前致谢。

4

1 回答 1

1

如果您正在寻找您所描述的确切内容,那么有一些方法可能会很好地工作。有几篇论文描述了可以用作优先级队列的并发数据结构;这是我不太熟悉但看起来很有希望的一种选择。您可能还想查看并发跳过列表,这也应该符合您的要求。

如果我正确地解释了您的问题陈述,您希望根据您收到的点击次数保持前 10 位位置列表。如果是这样的话,我会怀疑虽然更新的数量会很大,但两个位置切换位置的次数实际上并不会那么大。换句话说,大多数更新实际上并不需要数据结构改变形状。因此,您可以考虑使用标准二进制堆,其中每个元素都使用原子比较和设置整数键,并且您有某种锁定系统,仅在您需要添加、移动或删除一个堆中的元素。

鉴于您工作的规模,您可能还需要考虑问题的近似解决方案。例如, count-min sketch数据结构是专门为估计数据流中的频繁元素而设计的,而且速度非常快。它可以很容易地以类似于我上面描述的方式与优先级队列进行分发和链接。那里有很多很好的实现,如果我没记错的话,这个数据结构实际上是在你描述的那种情况下部署的。

希望这可以帮助!

于 2015-07-07T18:26:10.290 回答