按照如此配置redis SpringBoot RedisTemplate 集群配置使用
1、执行一个简单的lua脚本
public void eval() {
try {
DefaultRedisScript<Object> script = new DefaultRedisScript<>();
script.setResultType(Object.class);
script.setScriptText("return {ARGV[1]}");
script.getSha1();
List<String> 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);
}
同时需要引入包:
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
2⃣️、会报此错误:CROSSSLOT Keys in request don't hash to the same slot
--keys不能落在同一个节点
上面的代码传入了两个key,key1
、key2
,但算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说明

网友评论