用于top-N geohash的实时多线程最大堆

时间:2015-04-27 10:38:09

标签: multithreading data-structures heap real-time binary-heap

要求在一个城市保留一份前10个地方的名单,以便在任何特定时刻发出对我们食品服务的需求。这个城市可能有数万个地方。 如果必须在内存中实现近乎实时(滞后不超过5分钟)的数据存储区 - 按地点(地理哈希)计算传入需求的数量 - 每分钟由数百家供应商阅读(ajax刷新是每分钟)

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

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

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

是否有现成的解决方案?

持久性不是必需的,所以没有基于MySQL的解决方案。如果您推荐使用redis或mongo数据库解决方案,请注意查询不是按键查询 - 而是查询前N个查询。

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果您正在寻找您正在描述的内容,那么有一些方法可能会很好地运作。有几篇论文描述了可以作为优先级队列的并发数据结构; here is one option我不是很熟悉,但看起来很有前途。您可能还想查看并发跳过列表,这些列表也应符合您的要求。

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

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

希望这有帮助!