Как манипулировать числом в Redis с помощью Lua Script

Я пытаюсь умножить два числа, хранящиеся в Redis, с помощью сценария Lua. Но я получаю ClassCastException. Может кто-нибудь указать, что не так в программе

jedis.set("one", "1");
jedis.set("two", "2");
String script = "return {tonumber(redis.call('get',KEYS[1])) * tonumber(redis.call('get',KEYS[2]))}";
String [] keys = new String[]{"one","two"};
Object response =  jedis.eval(script, 2, keys );
System.out.println(response);

бросает

Exception in thread "main" java.lang.ClassCastException: java.lang.Long cannot be cast to [B
    at redis.clients.jedis.Jedis.getEvalResult(Jedis.java:2806)
    at redis.clients.jedis.Jedis.eval(Jedis.java:2766)
    at com.test.jedis.script.SimpleScript.main(SimpleScript.java:18)

person user1182253    schedule 29.06.2013    source источник


Ответы (1)


Вы не можете привести таблицу к числу в lua. Вместо этого вы хотите получить количество элементов в таблице. Вы можете сделать это, используя последнюю точку элемента #. Кроме того, я настоятельно рекомендую отделить ваш Lua-скрипт от остального кода, чтобы он был чище. Ваш Lua-скрипт должен выглядеть так:

local first_key = redis.call('get',KEYS[1])
local second_key = redis.call('get',KEYS[2])
return #first_key * #second_key

EDIT: Неправильно понял вопрос. ОП правильно указал, что он пытается умножить два числа, хранящиеся в виде строк, а не длины таблицы. В этом случае:

local first_key = redis.call('get',KEYS[1])
if not tonumber(first_key) then return "bad type on key[1]" end
local second_key = redis.call('get',KEYS[2])
if not tonumber(second_key) then return "bad type on key[2]" end
return tonumber(first_key) * tonumber(second_key)
person Eli    schedule 01.07.2013
comment
На самом деле я хотел умножить два числа в этих двух ключах, я изменил последнюю строку скрипта на (удален #) return first_key * second_key , и это сработало. Спасибо. И в приведенной выше программе redis.call() возвращает тип String, а не таблицу. - person user1182253; 02.07.2013