SpringBoot RedisTemplate 集群使用lua

按照如此配置redis SpringBoot RedisTemplate 集群配置使用

1、执行一个简单的lua脚本

  public void eval() {
        try {
            DefaultRedisScript script = new DefaultRedisScript<>();
            script.setResultType(Object.class);
            script.setScriptText("return {ARGV[1]}");
            script.getSha1();
            List keys = new ArrayList<>();
            keys.add("key1");
            keys.add("key2");
            Object execute = redisTemplate.execute(script, keys, 10L);
            System.out.println(execute);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
    }

2、解决问题

1⃣️、会报此错误:EvalSha is not supported in cluster environment
在stackoverflow找到解决办法点此
总结就是为了能在集群环境支持EvalSha,需要切换使用LettuceConnectionFactory,故替换 SpringBoot RedisTemplate 集群配置使用里面的redisConnectionFactory配置为如下:

@Bean
LettuceConnectionFactory redisConnectionFactory(RedisClusterConfiguration configuration) {
    return new LettuceConnectionFactory(configuration);
}

同时需要引入包:


    io.lettuce
    lettuce-core
    5.1.6.RELEASE

2⃣️、会报此错误:CROSSSLOT Keys in request don't hash to the same slot--keys不能落在同一个节点
上面的代码传入了两个key,key1key2,但算slot的时候发现并未落在同一个slot里面。
针对提示,那就让keys落在同一个slot里面就行啦
使用hash tag(hash tag是用于hash的部分字符串开始和结束的标记),即如果key的结构为{XXX}key,则只会对{}里面的XXX进行分区,就会落到同一个slot里面啦。
将上面的代码部分改动:

keys.add("{test}key1");
keys.add("{test}key2");

再次运行代码就能得到输出为:[10]
此问题其实在redis文档中有说明redis 中文eval说明

SpringBoot RedisTemplate 集群使用lua_第1张图片

你可能感兴趣的:(SpringBoot RedisTemplate 集群使用lua)