Ошибка выполнения скрипта spring-boot redisTemplate: EvalSha не поддерживается в среде кластера

Попытка выполнить скрипт lua с помощью redisTemplate в проекте с весенней загрузкой. Похоже, jedis не поддерживает выполнение сценария lua для кластера Redis... Есть ли другие альтернативы? Спасибо!

конфиг редиса:

spring:
  redis:
    cluster:
      nodes:
        - 192.168.0.111:6390
        - 192.168.0.111:6391
        - 192.168.0.111:6392

код:

@Component
public class Example {

@Autowired
private RedisTemplate redisTemplate;

@Autowired
RedisScript<Boolean> script;

public boolean checkAndSet(String expectedValue, String newValue) {
    return (boolean) redisTemplate.execute(script, singletonList("key1"), asList(expectedValue, newValue));
}
}

журналы ошибок:

org.springframework.dao.InvalidDataAccessApiUsageException: EvalSha is not supported in cluster environment.

at org.springframework.data.redis.connection.jedis.JedisClusterConnection.evalSha(JedisClusterConnection.java:3568)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.data.redis.core.CloseSuppressingInvocationHandler.invoke(CloseSuppressingInvocationHandler.java:57)
at com.sun.proxy.$Proxy237.evalSha(Unknown Source)
at org.springframework.data.redis.core.script.DefaultScriptExecutor.eval(DefaultScriptExecutor.java:81)
at org.springframework.data.redis.core.script.DefaultScriptExecutor$1.doInRedis(DefaultScriptExecutor.java:71)
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:207)
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:169)
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:157)
at org.springframework.data.redis.core.script.DefaultScriptExecutor.execute(DefaultScriptExecutor.java:60)
at org.springframework.data.redis.core.script.DefaultScriptExecutor.execute(DefaultScriptExecutor.java:54)
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:300)

person Clement.Xu    schedule 03.11.2017    source источник


Ответы (1)


Переключитесь на драйвер Lettuce, чтобы использовать EVALSHA в кластерной среде.

Конфигурация для Spring Boot 1.5.x может выглядеть так:

@Bean
LettuceConnectionFactory redisConnectionFactory(RedisProperties redisProperties) {

    Cluster clusterProperties = redisProperties.getCluster();
    RedisClusterConfiguration config = new RedisClusterConfiguration(
            clusterProperties.getNodes());

    if (clusterProperties.getMaxRedirects() != null) {
        config.setMaxRedirects(clusterProperties.getMaxRedirects());
    }

    return new LettuceConnectionFactory(config);
}
person mp911de    schedule 03.11.2017
comment
Спасибо. У вас есть пример весенней загрузки с использованием салата? - person Clement.Xu; 08.11.2017