我使用这样的代码来实现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"之间的.I检查过的文档,set指令加上'NX','EX'会返回"OK"或"Nil"。我的代码的结果是在Redis中键REDIS_KEY_INDEX_LOCK被成功地设置为值exists,但是Java变量result的值是null。redisTemplatet变量是StringRedisTemplate的实例,我使用的是Spring-Data-Redis。
请帮助我,解释为什么我得到一个意外的结果,以及如何纠正它。
发布于 2018-06-11 13:30:47
我现在知道原因了,在阅读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");https://stackoverflow.com/questions/50790110
复制相似问题