代码之家  ›  专栏  ›  技术社区  ›  Clement.Xu

spring boot redisTemplate执行脚本错误:群集环境中不支持EvalSha

  •  2
  • Clement.Xu  · 技术社区  · 7 年前

    在spring boot项目中,尝试使用redisTemplate执行lua脚本。看来绝地武士不支持为redis集群执行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)
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   mp911de    7 年前

    切换到要使用的莴苣驱动程序 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);
    }