问题如下: 我们正在开发Java客户端 - 服务器产品,它需要通过过滤来保护DDoS。 每个请求都包含客户端ID。 如果服务器在短时间内收到客户端过多的请求,客户端的ID将被添加到黑名单中。 服务器过滤请求,如果它是黑名单中的id,则忽略请求。
内存消耗是一个问题。需要最小化黑名单消耗的内存。
使用HashSet或TreeSet是不合适的。
是否存在实现这种集合的Java库,其中内存占用量小于num_elements * size_of_element?有可能吗?
或者如果不可能,什么是Java集实现,内存占用最小?
答案 0 :(得分:1)
是否存在实现这种集合的Java库,其中内存占用量小于num_elements * size_of_element?
我不知道这样的图书馆。
有可能吗?
理论上是的。您可以使用某种形式或压缩来表示一组客户端IP地址,其空间小于N * sizeof(IP地址)。
然而......
您需要的其他事项(我想)是快速查找IP地址和快速更新数据。这使得这成为一个难题,特别是如果您尝试使用Java编写代码,这不是实现最小内存数据结构的好语言。
实际上,还有另一种控制内存使用的方法。使用将accessOrder
设置为true
时创建的LinkedHashMap。这导致被委托的地图以LRU顺序排序。然后每次向地图添加条目时,请检查它是否太大。如有必要,请删除第一个条目...最近最少使用的条目。