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

标签 lua numbers redis jedis

我正在尝试使用 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)

最佳答案

您不能在 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)

关于lua - 如何使用 Lua 脚本在 Redis 中操作数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17380427/

相关文章:

lua - lua 脚本中 grep 的替代方案

Lua 返回执行结果为字符串

json - 从输入流中读取时属性的类型不一样

node.js - 等待数据在数据库中出现/更改

angularjs - 前端/NodeJS 上的 LocalStorage 与 Redis

node.js - redis扫描迭代器配置

c++ - Lua使用C++向用户数据添加实例字段

sorting - Redis 基于分数和日期时间排序的集合作为决胜局?

algorithm - 以用户友好的方式对包含数字的字符串进行排序

matlab - 向量中的数字出现