Массовые операции Java + Membase + spymemcached - PullRequest
0 голосов
/ 17 августа 2011

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

spymemcached позволяет массовое получение, но не массовое CAS или добавление; функции, которые, я думаю, будут широко использоваться в случае их реализации.

На данный момент мой код для набора массовых операций примерно такой, как показано ниже.

«клиент» - это один MemcachedClient.

ArrayList<Future<Boolean>> futures = new ArrayList<Future<Boolean>>();
ArrayList<String> bulkGet = new ArrayList<String>();
for(int i=0; i<50; i++){
    String key = "Key_" + x + "_" + i;
    Future<Boolean> fut = client.add(key, 0, "Value_" + x + "_" + i);
    futures.add(fut);
    bulkGet.add(key);
}

int count = 0;
for(Future<Boolean> fut : futures){
    if(fut.get()==true){
        count++;
    }
}
System.out.println("Added " + count + " records.");

Map<String,Object> bulkGot = client.getBulk(bulkGet);
System.out.println("Retrieved " + bulkGot.size() + " records");

Блокирующий вызов Future.get () кажется крайне неэффективным, есть ли лучший способ? В моем реальном сценарии я хотел бы иметь возможность обрабатывать фьючерсы, как только они возвращаются (что может быть или не быть в том порядке, в котором они были отправлены?).

Кроме того, возможны ли следующие операции (или планируется ли их реализация)?

-Добавить или вернуть существующее значение

-Удалить, если значение равно известному значению

-Установить, если значение равно известному значению

Спасибо, Marcus

1 Ответ

0 голосов
/ 18 августа 2011

Я постараюсь рассмотреть здесь как можно больше вещей.

Spymemcached позволяет массово получать, но не массово получать CAS или добавлять;функции, которые, я думаю, будут широко использоваться, если они будут реализованы.

Я полностью согласен с этим, но мы, вероятно, не пойдем на это, добавив функции bulkAdd, bulkCas, ... в MemcachedClient.Spymemcached в настоящее время по умолчанию оптимизирует операции получения и установки, отправляя их как массовые наборы или массовые загрузки, когда это возможно.Есть планы распространить это на все операции memcached, но это еще не сделано.Хотя, когда это произойдет, это произойдет за кулисами и, вероятно, не будет напрямую доступно для пользователей с spymemcached.

Блокирующий вызов Future.get () кажется крайне неэффективным?

Да, чтоЯ расскажу ниже, но также учтите, что если бы это была массовая операция, то ваш код все равно немного блокировался бы.С отдельными операциями добавления ваш код, вероятно, будет блокироваться только для первой операции, потому что после этого все остальные операции будут уже завершены, поэтому вызовы Future.get () после первого вызова немедленно вернутся.

есть лучший способ?

Вы можете расширить класс MemcachedClient и скопировать одну из существующих функций и добавить свой собственный код в функцию обратного вызова.

Также возможны следующие операции (или планированиедолжно быть реализовано)?

Spymemcached реализует все функциональные возможности, которые предлагает memcached.Упомянутые вами операции уже могут быть построены с функциональностью, которую имеет Spymemcached.

-Добавить или вернуть существующее значение

add keyA.В случае неудачи get keyA.

-Удалить, если значение равно известному значению

get keyA.Если keyA равно известному значению, удалить keyA

- Установить, если значение равно известному значению

get keyA.Если keyA равно известному значению, установите keyB.

Если вы хотите добавить новые опции в memcached, то вы должны опубликовать свои запросы на memcached.org.Честно говоря, парни из memcached любят держать API как можно меньше, поэтому я не думаю, что они будут добавлены.

...