如何使用Lua脚本操作Redis中的数字

如何使用Lua脚本操作Redis中的数字,lua,numbers,redis,jedis,Lua,Numbers,Redis,Jedis,我试图使用Lua脚本将Redis中存储的两个数字相乘。但是我得到了一个惊喜。有人能指出程序中的错误吗 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

我试图使用Lua脚本将Redis中存储的两个数字相乘。但是我得到了一个惊喜。有人能指出程序中的错误吗

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)

在lua中不能将表转换为数字。您想要的是获取表中元素的数量。您可以使用最后一个元素点
#
来完成此操作。另外,我强烈建议将Lua脚本与代码的其余部分分开,这样更干净。您的Lua脚本应该如下所示:

local first_key = redis.call('get',KEYS[1])
local second_key = redis.call('get',KEYS[2])
return #first_key * #second_key
编辑:误解了问题。OP正确地指出,他试图将存储为字符串而不是表长度的两个数字相乘。在这种情况下:

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)

实际上,我想将这两个键中的两个数字相乘,我已将脚本的最后一行更改为(已删除)return first_key*second_key,它成功了。谢谢在上面的程序中,redis.call()返回字符串类型,而不是表。