使用RedisTemplate执行lua脚本时令人困惑的结果

时间:2018-09-27 12:21:06

标签: java spring-boot lua redis spring-data-redis

我正在使用spring-boot-starter-data-redis 2.0.5.RELEASE。我用RestTemplate执行一个lua脚本。 脚本:

-- hold.lua
if redis.call('get', KEYS[1]) == ARGV[1] then
    redis.call('pexpire', KEYS[1], ARGV[2])
    return 1
end
return 0

Java代码:

@Override
public void executeHold(String lockKey, String lockValue, long expireInMillis) {
    DefaultRedisScript<Boolean> holdScript = new DefaultRedisScript<>();
    holdScript.setLocation(new ClassPathResource("lua/hold.lua"));
    holdScript.setResultType(Boolean.class);
    // CODE 1
    Boolean result = redisTemplate.execute(holdScript, Collections.singletonList(lockKey), lockValue, expireInMillis);
    // END of CODE 1
    //        // CODE 2
    //        String script = holdScript.getScriptAsString();
    //        Boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
    //            @Override
    //            public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
    //                return connection.scriptingCommands()
    //                        .eval(
    //                                script.getBytes(),
    //                                ReturnType.fromJavaType(Boolean.class),
    //                                1,
    //                                lockKey.getBytes(),
    //                                lockValue.getBytes(),
    //                                String.valueOf(expireInMillis).getBytes()
    //                        );
    //            }
    //        });
    //        // END of CODE 2
    System.out.println(holdScript.getSha1());
    LOGGER.debug("Execute holdScript, result={}, content=\n{}", result, holdScript.getScriptAsString());
}

我已将lockKey设置为redis:

127.0.0.1:6379> set lockKey lockValue PX 600000 NX

运行上面的代码并使用CODE 1时,我总是得到result = false

但是当我更改上面的代码并使用CODE 2时,我可以预期得到正确的结果。

这真的让我感到困惑,有人可以帮助我找出问题所在吗?谢谢。

我想做的是Here

1 个答案:

答案 0 :(得分:0)

我正面临类似的问题。问题的根本原因是我在Redis模板中使用json序列化程序,并且在传递给脚本的字符串值中添加了额外的引号。将序列化程序更改为字符串序列化程序解决了我的问题。