按照如此配置redis SpringBoot RedisTemplate 集群配置使用
1、執(zhí)行一個(gè)簡(jiǎn)單的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??、會(huì)報(bào)此錯(cuò)誤:EvalSha is not supported in cluster environment
在stackoverflow找到解決辦法點(diǎn)此
總結(jié)就是為了能在集群環(huán)境支持EvalSha,需要切換使用LettuceConnectionFactory,故替換 SpringBoot RedisTemplate 集群配置使用里面的redisConnectionFactory配置為如下:
@Bean
LettuceConnectionFactory redisConnectionFactory(RedisClusterConfiguration configuration) {
return new LettuceConnectionFactory(configuration);
}
同時(shí)需要引入包:
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
2??、會(huì)報(bào)此錯(cuò)誤:CROSSSLOT Keys in request don't hash to the same slot--keys不能落在同一個(gè)節(jié)點(diǎn)
上面的代碼傳入了兩個(gè)key,key1、key2,但算slot的時(shí)候發(fā)現(xiàn)并未落在同一個(gè)slot里面。
針對(duì)提示,那就讓keys落在同一個(gè)slot里面就行啦
使用hash tag(hash tag是用于hash的部分字符串開始和結(jié)束的標(biāo)記),即如果key的結(jié)構(gòu)為{XXX}key,則只會(huì)對(duì){}里面的XXX進(jìn)行分區(qū),就會(huì)落到同一個(gè)slot里面啦。
將上面的代碼部分改動(dòng):
keys.add("{test}key1");
keys.add("{test}key2");
再次運(yùn)行代碼就能得到輸出為:[10]
此問題其實(shí)在redis文檔中有說明redis 中文eval說明
