2015-02-07 99 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