首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个Redis分布式锁与Lua脚本混淆的结果

一个Redis分布式锁与Lua脚本混淆的结果
EN

Stack Overflow用户
提问于 2018-06-11 11:18:43
回答 1查看 575关注 0票数 0

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

代码语言:javascript
复制
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的值是nullredisTemplatet变量是StringRedisTemplate的实例,我使用的是Spring-Data-Redis

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

EN

回答 1

Stack Overflow用户

发布于 2018-06-11 13:30:47

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

代码语言:javascript
复制
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");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50790110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档