Java Redis分布式锁与Lua脚本的混淆结果

Java Redis分布式锁与Lua脚本的混淆结果,java,lua,redis,spring-data-redis,Java,Lua,Redis,Spring Data Redis,我用这样的代码实现Redis分布式锁: DefaultRedisScript<String> script = new DefaultRedisScript<>(); script.setScriptText("if not redis.call('get', KEYS[1]) then return redis.call('set', KEYS[1], ARGV[1],'ex',ARGV[2],'nx') else return false end"); String

我用这样的代码实现Redis分布式锁:

DefaultRedisScript<String> script = new DefaultRedisScript<>();
script.setScriptText("if not redis.call('get', KEYS[1]) then return redis.call('set', KEYS[1], ARGV[1],'ex',ARGV[2],'nx') else return false end");
String result = redisTemplate.execute(script,
            Collections.singletonList("REDIS_KEY_INDEX_LOCK"), "exists", "60");
DefaultRedisScript脚本=新建DefaultRedisScript();
script.setScriptText(“如果不是redis.call('get',key[1]),则返回redis.call('set',key[1],ARGV[1],'ex',ARGV[2],'nx'),否则返回false end”);
字符串结果=redisTemplate.execute(脚本,
集合。单例列表(“REDIS\u KEY\u INDEX\u LOCK”)、“exists”、“60”);
我希望结果将在
“OK”
“Nil”
“false”
之间。我检查了文档,使用
'NX'
设置指令,
'EX'
将返回
“OK”
“Nil”
。 我的代码的结果是,key
REDIS\u key\u INDEX\u LOCK
的值在REDIS中成功设置为
exists
,但Java变量
result
的值为
null
redistemplate
变量是
StringRedisTemplate
的一个实例,我正在使用
Spring数据Redis


请帮助我,解释为什么我得到了一个意外的结果以及如何更正它。

我现在知道了原因,在阅读了
Spring Data Redis
源代码后,需要明确指定脚本的返回类型

DefaultRedisScript<String> script = new DefaultRedisScript<>();
script.setScriptText("if not redis.call('get', KEYS[1]) \n" +
            "then if(redis.call('set', KEYS[1], ARGV[1],'EX',ARGV[2],'NX'))  \n" +
            "    then return \"true\";\n" +
            "    else return \"false\";\n" +
            "end\n" +
            "else return \"false\";\n" +
            "end");
script.setResultType(String.class);//need to specify return type explicitly
String result = redisTemplate.execute(script,
            Collections.singletonList("REDIS_KEY_INDEX_LOCK"),"exists","60");

return result.equals("true");
DefaultRedisScript脚本=新建DefaultRedisScript();
script.setScriptText(“如果不是redis.call('get',键[1])\n”+
然后如果(redis.call('set',键[1],ARGV[1],'EX',ARGV[2],'NX'))\n+
然后返回“true”;\n+
否则返回“false”;\n+
“结束\n”+
否则返回“false”;\n+
“结束”);
script.setResultType(String.class)//需要显式指定返回类型
字符串结果=redisTemplate.execute(脚本,
集合。单例列表(“REDIS\u KEY\u INDEX\u LOCK”)、“exists”、“60”);
返回结果。等于(“真”);