Как лучше всего обращаться с коллекциями (списками или наборами) в хранилище значений ключей? - PullRequest
3 голосов
/ 02 марта 2009

Интересно, что может быть эффективным способом добавления / удаления элементов из действительно большого списка, когда ваше хранилище похоже на memcached? Может быть, есть какое-то распределенное хранилище с интерфейсом Java, которое хорошо справляется с этой проблемой?

Кто-то может порекомендовать терракоту. Я знаю об этом, но это не совсем то, что мне нужно. ;)

Ответы [ 3 ]

2 голосов
/ 05 марта 2009

Hazelcast 1.6 будет иметь распределенную реализацию MultiMap, где ключ может быть связан с набором значений.

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 - это транзакция с открытым исходным кодом, распределенная / распределенная реализация службы очереди, темы, карты, множества, списка, блокировки и исполнителя. С ним очень легко работать; просто добавьте hazelcast.jar в ваш путь к классам и начните кодировать. Почти не требуется настройка.

Hazelcast выпускается под лицензией Apache, также доступна поддержка уровня предприятия. Код размещен на Google Code .

0 голосов
/ 13 мая 2009

Вы можете использовать хранилище значений ключей для моделирования большинства структур данных, если игнорируете проблемы параллелизма. Ваши требования не совсем ясны, поэтому я собираюсь сделать некоторые предположения относительно вашего варианта использования. Надеюсь, если они неверны, вы можете обобщить подход.

Вы можете тривиально создать связанный список в хранилище, имея известный корневой узел (назовем его 'node_root'), который указывает на кортеж значения {data, prev_key, next_key}. Элементы prev_key и next_key - это имена ключей, которые должны следовать соглашению 'node_foo', где foo - это UUID (в идеале вы можете генерировать их последовательно, если нет, то можете использовать какой-либо другой тип UUID). Это обеспечивает упорядоченный доступ к вашим данным.

Теперь, если вам нужно O (1) удаление ключа, вы можете добавить второй индекс в структуру с ключом 'data' и значением 'node_foo' для правого foo. Затем вы можете выполнить удаление так же, как и связанный список в памяти. Удалите узел индекса, когда закончите.

Теперь, имейте в виду, что одновременное изменение этого списка так же плохо, как и одновременное изменение любой общей структуры данных. Если вы используете что-то вроде BDB, вы можете использовать их (превосходную) поддержку транзакций, чтобы избежать этого. Для чего-либо без транзакций или управления параллелизмом вы захотите обеспечить внешнюю блокировку или сериализованный доступ к одному потоку.

0 голосов
/ 13 марта 2009

Может быть, вам стоит взглянуть на Scalaris !

...