Непонятный результат при использовании RedisTemplate для выполнения сценариев lua - PullRequest
0 голосов
/ 27 сентября 2018

Я использую spring-boot-starter-data-redis 2.0.5.RELEASE.Я выполняю скрипт lua с RestTemplate.Сценарий:

-- 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, я могу получить правильный результат ожидаемым образом.

Это действительно смутило меня,Кто-нибудь может помочь мне найти, что с ним не так?Спасибо.

То, что я хочу сделать, это Здесь .

...