使用spring封装的redis的单点模式和哨兵(sentinel)模式支持lua脚本预加载到内存中去,这样执行这个脚本的时候直接把SHA值传到redis就可以直接交到对应脚本并执行,这样能大幅度提升应用执行lua脚本的速度,但是cluster集群是不直接支持的,会直接抛异常
思路(将lua脚本加载到每个节点,然后再去执行evalsha的时候就每个节点都能找到了):
1.将lua脚本预加载到redis中
#预加载lua脚本第一种方式:使用JedisCluster
JedisCluster jedisCluster = (JedisCluster) stringRedisTemplate.getConnectionFactory().getConnection().getNativeConnection(); jedisCluster.scriptLoad(scriptStr, scriptSha1())
#预加载lua脚本第二种方式:使用Jedis
Jedis jedis = new Jedis("127.0.0.1",6379);
jedis.scriptLoad(scriptAsString);
jedis.close();
2.使用JedisCluster去调用evalsha
JedisCluster jedisCluster = (JedisCluster) stringRedisTemplate.getConnectionFactory().getConnection().getNativeConnection();
Object evalsha = jedisCluster.evalsha(scriptSha1, Arrays.asList(key), Arrays.asList(params));