java - Redis分布式锁混淆结果与Lua脚本

标签 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','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/

相关文章:

php - Kubernetes 集群中的 Laravel ENV 变量冲突

session - 使用 express 验证用户的最简单方法?

java - Apache Camel 文件组件 "idempotentRepository"选项与幂等消费者处理器?

java - setSelected 基于 Action 命令的按钮组中的特定 jradiobutton

assembly - Lua动态Asm : Any reference or links to guide me through?

redis - 将对象数组传递给 Redis Lua 脚本的最佳方法

java - 窗口回调 onMenuOpened 和 onPanelClosed 用于随工具栏膨胀的菜单

java - 如何不允许用户在 ArrayList 的对象中输入重复条目

c++ - Lua C API 内存泄漏? (valgrind)

django - 使用 ElastiCache Redis 配置 django-redis 时出现问题(已启用集群模式)