使用 Lua 脚本实现 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" 中的一个。我查看了文档,带有 'NX''EX'set 指令将返回 "OK""Nil"。 然而我的代码结果是,在 Redis 中,键 REDIS_KEY_INDEX_LOCK 成功设置为值 exists,但是 Java 变量 result 的值为 nullredisTemplate 变量是 StringRedisTemplate 的实例,我使用了 Spring-Data-Redis

请帮我解释为什么会出现这种意外的结果并且如何进行修正。

点赞
用户7130415
用户7130415

现在我明白了,在阅读了 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);//需要显式指定返回类型
String result = redisTemplate.execute(script,
            Collections.singletonList("REDIS_KEY_INDEX_LOCK"),"exists","60");

return result.equals("true");
2018-06-11 05:30:47