redis.clients.jedis.exceptions.JedisDataException: ERR Ошибка компиляции скрипта (новая функция): user_script: 1: неправильное число рядом - PullRequest
1 голос
/ 03 февраля 2020

Я пишу сценарий lua в Redis и выполняю его весной, содержимое просто, как

local store =   redis.call('hget',KEYS[1],'capacity')
print(store)
if store <= 0
then return 0
end
store = store - 1
redis.call('hset',KEYS[1],'capacity',store)
redis.call('sadd',KEYS[2],ARGV[1])
return 1

, но когда я запускаю этот сценарий, исключение выдает

redis.clients.jedis.exceptions.JedisDataException: ERR Error compiling script (new function): user_script:1: malformed number near '262b4ca69c1805485d135aa6298c2b00bc7c8c09' 

И я попробовал следующий скрипт в redis-cli

eval "local s = tonumber(redis.call('hget',KEYS[1],'capacity')) return s" 1 001

Возвращает

(integer) 100

И код Java выглядит следующим образом:

String script ="local store =   redis.call('hget',KEYS[1],'capacity')\n" +
                "print(store)\n" +
                "if store <= 0\n" +
                "then return 0\n" +
                "end\n" +
                "store = store - 1\n" +
                "redis.call('hset',KEYS[1],'capacity',store)\n" +
                "redis.call('sadd',KEYS[2],ARGV[1])\n" +
                "return 1\n" +
                "\n";

        if(sha==null){
            sha = jedis.scriptLoad(script) ;
            System.out.println("sha:"+sha);
        }
        Object ojb = jedis.eval(sha,2,id,userName,id) ;

Теперь я так растерялся, и любая помощь будет благодарна

1 Ответ

0 голосов
/ 03 февраля 2020

Вы хотите использовать jedis.evalsha вместо jedis.eval.

Ошибка, которую вы получаете, - сервер Redis пытается интерпретировать 262b4ca69c1805485d135aa6298c2b00bc7c8c09 как фактический скрипт. Для вызова ранее загруженного скрипта вы используете команду EVALSHA .

...