3

我想知道当您的存储类似于 memcached 时,从一个非常大的列表中添加/删除项目的有效方法是什么?也许有一些带有Java接口的分布式存储可以很好地处理这个问题?

有人可能会推荐兵马俑。我知道,但这并不是我所需要的。;)

4

3 回答 3

2

Hazelcast 1.6 will have distributed implementation MultiMap, where a key can be associated with a set of values.

MultiMap<String, String> multimap = Hazelcast.getMultiMap ("mymultimap");
multimap.put ("1", "a");
multimap.put ("1", "b");
multimap.put ("1", "c");
multimap.put ("2", "x");
multimap.put ("2", "y");

Collection<String> values = multimap.get("1"); //containing a,b,c

Hazelcast is an open source transactional, distributed/partitioned implementation of queue, topic, map, set, list, lock and executor service. It is super easy to work with; just add hazelcast.jar into your classpath and start coding. Almost no configuration is required.

Hazelcast is released under Apache license and enterprise grade support is also available. Code is hosted at Google Code.

于 2009-03-05T14:41:33.513 回答
0

也许你也应该看看Scalaris

于 2009-03-13T13:23:47.707 回答
0

如果您忽略并发问题,您可以使用键值存储对大多数数据结构进行建模。您的要求并不完全清楚,因此我将对您的用例做出一些假设。希望如果它们不正确,您可以概括该方法。

您可以通过具有一个指向 {data, prev_key, next_key} 的值元组的已知根(我们称之为“node_root”)节点在存储中轻松创建一个链表。prev_key 和 next_key 元素是键名,应遵循约定“node_foo”,其中 foo 是 UUID(理想情况下,您可以按顺序生成这些,如果不是,您可以使用其他类型的 UUID)。这提供了对您数据的有序访问。

现在,如果您需要 O(1) 删除键,您可以在结构上添加第二个索引,其中键为“数据”,值为“node_foo”,用于正确的 foo。然后,您可以像处理内存中的链表一样执行删除。完成后删除索引节点。

现在,请记住,并发修改此列表与并发修改任何共享数据结构一样糟糕。如果您使用的是 BDB 之类的东西,您可以使用它们(出色的)事务支持来避免这种情况。对于没有事务或并发控制的东西,您需要提供外部锁定或序列化对单个线程的访问。

于 2009-05-13T01:21:56.477 回答