Распределенная блокировка Redis путает результат со скриптом Lua - PullRequest
0 голосов
/ 11 июня 2018

Я использую такой код для достижения распределенной блокировки 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 равно null.redisTemplatet переменная является экземпляром StringRedisTemplate, я использую Spring-Data-Redis.

Пожалуйста, помогите мне, объясните, почему я получил неожиданный результат и как его исправить.

1 Ответ

0 голосов
/ 11 июня 2018

Теперь я знаю причину, прочитав исходный код 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");
...