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

3

我正在尝试使用Lua脚本在Redis中相乘两个数字。但是我遇到了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)
1个回答

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

编辑:误解了问题。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)

实际上,我想要在这两个键中相乘两个数字。我已经将脚本的最后一行改为(删除了#) 返回 first_key * second_key ,然后它就起作用了。谢谢。而且,在上面的程序中,redis.call() 返回的是字符串类型,而不是表格。 - user1182253

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接