问题如下: 我们正在开发 Java 客户端-服务器产品,需要通过过滤进行 DDoS 保护。 每个请求都包含客户端 ID。 如果服务器在短时间内收到过多的客户端请求,客户端的ID就会被添加到黑名单中。 服务器过滤请求,如果id在黑名单中,则请求被忽略。
内存消耗是一个问题。需要尽量减少黑名单消耗的内存。
使用HashSet或TreeSet是不合适的。
是否有一个Java库可以实现这样一种集合,其中内存占用小于num_elements * size_of_element?可能吗?
或者如果不可能,什么是具有最小内存占用的 Java set 实现?
最佳答案
Is there a Java library that implements such a kind of set, where memory footprint is smaller than num_elements * size_of_element?
我不知道有这样的库。
Is it possible?
理论上是的。您可以使用某种形式或压缩来表示一组客户端 IP 地址,其空间小于 N * sizeof(IP 地址)。
但是...
您需要的其他东西(我想)是快速 IP 地址查找和快速 数据更新。这使得这是一个困难的问题,特别是如果您尝试使用 Java 进行编码,而 Java 并不是实现最小内存数据结构的好语言。
<小时/>实际上,还有另一种方法可以控制内存使用。使用将 accessOrder
设置为 true
创建的 LinkedHashMap。这会导致输入的映射按 LRU 顺序排序。然后,每次向 map 添加条目时,请检查它是否太大。如有必要,删除第一个条目...最近最少使用的条目。
关于减少内存占用的 Java 集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28383250/