我是用这样的代码实现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'
,'EX'
将返回 "OK"
或 "Nil"
。
我的代码的结果是,键 REDIS_KEY_INDEX_LOCK
在 Redis 中成功设置为值 exists
,但是 Java 变量 result
的值是 空
。
redisTemplatet
变量是 StringRedisTemplate
的实例,我使用的是 Spring-Data-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");
关于java - Redis分布式锁混淆结果与Lua脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50790110/