Как динамический командный интерфейс Lettuce работает с модулями Redis?

Попытка отправить команды RedisTimeSeries через салат (Java) в Redis. Он работал с простыми командами, такими как TS.Create, но я не мог заставить работать немного более сложные команды (например, TS.ADD, который принимает ключ, счет, значение как аргументы) или TS.Range (который принимает аргументы и возвращает список) для Работа.

Redis работает в Linux (Ubuntu работает в Windows 10 через WSL), RedisTimeSeries установлен на Redis. Команды Redis и RedisTimeSeries были протестированы с использованием Redis-cli в Linux, они работают нормально. Я использую VS Code + JDK 13.0 + Maven для создания и тестирования Java-клиента для Redis. Пока команды Redis, поддерживаемые Lettuce, работают через клиента, а также некоторые простые команды RedisTimeSeries.

Фрагмент кода:

    RedisCommands<String, String> syncCommands = MyRedisClient.getSyncCommands(connection);

    // this works:
    RedisCodec<String, String> codec = StringCodec.UTF8;
    String result = syncCommands.dispatch(TS.CREATE, new StatusOutput<>(codec),new CommandArgs<>(codec).addKey("myTS"));    
    System.out.println("Custom Command TS.CREATE " + result);

    //custom command definition:
    public enum TS implements ProtocolKeyword{
        CREATE;
        public final byte[] bytes;
        private TS() {
            bytes = "TS.CREATE".getBytes(StandardCharsets.US_ASCII);
        }
        @Override
        public byte[] getBytes() {
            return bytes;
        }   
    }

Но когда я переключил все на тестирование TS.ADD, это не сработало, хотя я соответственно добавил дополнительные аргументы. например

    String result = syncCommands.dispatch(TS.ADD, new StatusOutput<>(codec),new CommandArgs<>(codec).addKey("myTS").addValue("1000001").addValue("2.199")); 

Вот исключение из пробега:

    Exception in thread "main" io.lettuce.core.RedisException: java.lang.IllegalStateException
        at io.lettuce.core.LettuceFutures.awaitOrCancel(LettuceFutures.java:129)
        at io.lettuce.core.FutureSyncInvocationHandler.handleInvocation(FutureSyncInvocationHandler.java:69)
        at io.lettuce.core.internal.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:80)
        at com.sun.proxy.$Proxy0.dispatch(Unknown Source)
        at MyRedisClient.main(MyRedisClient.java:72)

person Jason Xu    schedule 04.11.2019    source источник


Ответы (1)


Извините, что увидел это так поздно. Если вы еще не нашли решение, я изначально реализовал команды RediSearch с помощью динамических команд.

public interface RediSearchCommands extends Commands {

    @Command("FT.SUGADD ?0 ?1 ?2")
    Long sugadd(String key, String string, double score);
 
    ...
}

public void testSuggestions() {
    RedisCommandFactory factory = new RedisCommandFactory(client.connect());
    RediSearchCommands commands = factory.getCommands(RediSearchCommands.class);
    commands.sugadd(key, "Herbie Hancock", 1.0);
}

Полный исходный код: https://github.com/RediSearch/145ec8e4e4e4e4e4e08e4e4e08e4e4e4e4e4e4e4e4e4e4e4e08e4e4e4eaaaaaaaaa

person Julien    schedule 05.07.2020