我正在尝试使用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)
答案 0 :(得分: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)