每秒3K个传入请求的重复检测,推荐的数据结构/算法?

cod*_*ing 5 java algorithm concurrency servlets data-structures

设计一个服务端点(可能是一个简单的servlet)每秒必须处理3K请求的系统(数据将被http发布).

然后这些请求将存储到mysql中.

我需要指导的关键问题是它们将是发布到此端点的高%重复数据.

我只需要将唯一数据存储到mysql中,那么您建议我使用什么来处理重复?

发布的数据如下所示:

<root>
<prop1></prop1>
<prop2></prop2>
<prop3></prop3>
<body>
maybe 10-30K of test in here
</body>
</root>
Run Code Online (Sandbox Code Playgroud)

我将编写一个方法,将prop1,prop2,pro3哈希,以创建一个唯一的哈希码(正文可以是不同的,仍然被认为是唯一的).

我正在考虑创建某种并发字典,这些字典将在请求中共享.

他们更有可能在24小时内重复发布数据.所以我可以在每x个小时后从这本字典中清除数据.

有关存储重复的数据结构的任何建议吗?考虑到清除以及考虑每秒3K请求我应该存储多少条记录,即它会变得非常快.

注意:它们是将要发布的10K个不同来源,并且只有给定来源才会出现重复的可能性.意思是我可能有一个以上的字典,可能是一组消息来源.意思是如果source1发布数据,然后source2发布数据,则重复的更改非常低.但如果source1一天发布100次,则重复的可能性非常高.

注意:请暂时忽略将发布的数据保存到mysql的任务,因为这是另一个问题,重复检测是我需要帮助的第一个障碍.

K E*_*son 1

有趣的问题。

我可能会在这里查看 HashMap 结构的某种 HashMap,其中 HashMap 的第一级将使用源作为键,第二级将包含实际数据(用于检测重复项的最小数据)并使用哈希码函数进行哈希。对于实际实现,Java 的 ConcurrentHashMap 可能是选择。

这样,如果您需要将负载分配到多台计算机上,您还可以设置结构来根据源对传入负载进行分区。

关于清除,我认为您必须使用生产数据来衡量确切的行为。您需要了解当您成功消除重复项时数据增长的速度以及数据如何分布在 HashMap 中。凭借良好的分布和不太快的增长,我可以想象偶尔进行清理就足够了。否则,也许 LRU 策略会很好。