2011-04-07 68 views
0

爲了解釋域...緩存數據結構設計

我有物品的一堆(1,000,000),每個特定類型的12種可能的類型中的(類型A,類型B ...... TypeK) 有3不可變類即ItemKey(唯一標識項),ItemTypeKey(唯一標識類型)和ItemType(包含包含ItemTypeKey的類型數據)

我在前面有一個緩存,它將數據存儲在兩個數據結構中。 。

ConcurrentHashMap<ItemKey, ItemTypeKey> 
ConcurrentHashMap<ItemTypeKey, ItemType> 

我會簡單地實現它作爲一個ConcurrentHashMap<ItemKey, ItemType> 的內存佔用會minimial在這種情況下也作爲緩存僅存儲反正引用。

分裂我沒有看到的緩存有什麼特別的優勢嗎? 也歡迎任何替代數據結構設計

+1

我想指出在ConcurrentHashMap大小的情況下,您可能需要考慮放入併發級別(使用此構造函數:ConcurrentHashMap(int initialCapacity,float loadFactor,int concurrencyLevel))。 默認併發級別爲16,可能希望使其更小以減少內存。 – LazyCubicleMonkey 2011-04-07 04:12:53

回答

0

那麼,您是否曾經需要使用ItemTypeKey作爲查找元素來查找?這是你這樣做的唯一原因。

您展示的樣品的其他潛在問題是潛在的競爭條件。這兩個地圖是ConcurrentHashMaps,這意味着有人打算在多線程情況下使用它。如果在兩個地圖的使用周圍沒有同步鎖(在這種情況下,普通的HashMap可能會正常),那麼當添加/刪除項目(其中一個地圖被更新而另一個地圖未被更新)時,可能存在短暫的不一致。這可能無關緊要 - 取決於該計劃。

這是說的很散漫的方式,「如果是的ItemKey不變的呀,而且你不需要ItemTypeKey作爲查找(至少一次),你的重構聽起來不錯」 :)

+0

感謝驗證MJB。 ItemTypeKey是嚴格內部的,並且不執行查找。我傾向於回答你的回答,但會持續一段時間來徵求其他意見。關於缺乏原子性的好處 – qwerty 2011-04-07 04:37:45