2015-02-07 108 views
0

问题如下: 我们正在开发Java客户端 - 服务器产品,需要通过过滤来保护DDoS。 每个请求包含客户端ID。 如果服务器在短时间内收到来自客户端的太多请求,客户端的ID将被添加到黑名单中。 服务器过滤请求,如果它是黑名单中的ID,请求将被忽略。减少内存占用量的Java集

内存消耗是一个问题。它需要最大限度地减少黑名单所消耗的内存。

使用HashSet或TreeSet不合适。

是否有一个Java库实现了这样一种集合,其内存占用量小于num_elements * size_of_element?可能吗?

或者,如果这是不可能的,那么Java集的实现是什么,最小的内存占用?

+0

不,不可能存储少于数据(!)的数据。由于其性能特点,“集合”具有较大的内存开销 - 它保证了唯一性并且具有快速搜索。一个'HashSet'可能是您的情况的正确选择。另一种选择是一个noSQL商店 - 虽然会显着减慢;这对你是否重要;只有你可以决定。 – 2015-02-07 14:27:11

+1

您意识到DDoS是一种*分布式* DoS攻击,意味着攻击最可能*不会来自单个客户端ID。 – aioobe 2015-02-07 14:30:35

+1

这不是Java的强项;在你的主应用程序的前面使用一个专用程序来处理这些事情。 – fge 2015-02-07 14:31:20

回答

1

有没有实现这样一种集,其中的内存占用比num_elements * size_of_element小的Java库?

我不知道这样的图书馆。

这可能吗?

理论上是。您可以使用某种形式或压缩来表示一组客户端IP地址,其空间少于N * sizeof(IP地址)。

但是......

,你需要(我猜)是IP地址的快速查找和数据的快速更新其他的事情。这使得这成为一个难题,尤其是如果你试图用Java来编写这种代码,这对于实现最小内存数据结构来说并不是一种很好的语言。


实际上,还有另一种控制内存使用情况的方法。使用accessOrder创建的LinkedHashMap设置为true。这导致所调用的地图按LRU顺序排序。然后,每次向地图添加条目时,请检查它是否不太大。如有必要,删除第一个条目......最近最少使用的条目。

+0

我在考虑压缩。我有一个想法:有消息摘要算法。算法采用输入字节序列并返回输入唯一的固定长度序列。可以是以多个元素作为输入(I)的算法,返回比总和输入元素大小小的一些结果(R)。算法有第二个操作:给定R(来自第一个操作的结果)和一个元素,它可以回答该元素在输入中。 – 2015-02-07 15:20:53