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

我正在尝试使用 Lua Script 在 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)
点赞
用户392975
用户392975

在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 "key[1]类型错误" end
local second_key = redis.call('get',KEYS[2])
if not tonumber(second_key) then return "key[2]类型错误" end
return tonumber(first_key) * tonumber(second_key)
2013-07-01 23:01:39