В салате я нахожу асинхронный mget на кластере redis значительно медленнее, чем конвейерная обработка - PullRequest
2 голосов
/ 07 мая 2019

Я пишу несколько тестов для нового проекта и сталкиваюсь с проблемой, когда салат (версия 5.1.3) и я нахожу код ниже, который использует mget:

 @Override
public Set<V> getKeys(final Set<Long> keySet) {

    try {
        return asyncCommands.mget(keySet.toArray(new Long[0])).get(
                5, TimeUnit.SECONDS
        ).stream().map(keyValue -> keyValue.getValue()).collect(Collectors.toSet());
    }  catch (Exception e) {
        throw new RuntimeException(e);
    }

Быть значительно медленнее (например, более чем в 100 раз медленнее), чем использовать сам конвейер:

List<RedisFuture<V>> futures = new ArrayList<>(keySet.size());
    keySet.forEach(
            key -> futures.add(asyncCommands.get(key))
    );

    asyncCommands.flushCommands();

    LettuceFutures.awaitAll(5, TimeUnit.SECONDS,
        futures.toArray(new RedisFuture[0]));

    final Set<V> collect = futures.stream().map(
            future -> {
                try {
                    return future.get(1, TimeUnit.SECONDS);
                } catch (Exception e) {
                    log.warn("", e);
                    throw new RuntimeException();
                }
            }
    ).filter(
            Objects::nonNull
    ).collect(Collectors.toSet());
    return collect;

Оба эти параметра выглядят довольно медленными по сравнению с тем, что сообщает сервер redis, но там могут быть и другие факторы.Javadocs говорят, что mget должен использовать конвейеризацию, так почему же он намного медленнее, чем когда я сам делаю конвейер?Что я не правильно делаю?

Редактировать: для mget у меня включены автозапускные команды, для конвейерной передачи он отключен.

Обновление: обнаружен виновник медленной производительности - медленный кодекМожно ли как-нибудь увеличить общую пропускную способность при медленном кодеке?

...