Redis分布式锁定令人困惑的结果与Lua脚本

时间:2018-06-11 03:18:43

标签: 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 result = redisTemplate.execute(script,
            Collections.singletonList("REDIS_KEY_INDEX_LOCK"), "exists", "60");

我希望结果会在"OK""Nil""false"之间。我检查了文档,set指令'NX',{{1 }}将返回'EX'"OK"。 我的代码的结果是在Redis中成功设置了值"Nil",值REDIS_KEY_INDEX_LOCK,但Java变量exists的值为result。   null变量是redisTemplatet的实例,我使用StringRedisTemplate

请帮助我,解释为什么我得到了意想不到的结果以及如何纠正它。

1 个答案:

答案 0 :(得分:0)

我在阅读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");