3

Lua スクリプトを使用して、Redis に保存されている 2 つの数値を乗算しようとしています。しかし、私は 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)
4

1 に答える 1

1

lua でテーブルを数値にキャストすることはできません。代わりに、テーブル内の要素の数を取得する必要があります。これは、最後の要素 point を使用して行うことができます#。また、Lua スクリプトを残りのコードから分離することを強くお勧めします。Lua スクリプトは次のようになります。

local first_key = redis.call('get',KEYS[1])
local second_key = redis.call('get',KEYS[2])
return #first_key * #second_key

編集:質問を誤解しました。OPは、テーブルの長さではなく、文字列として格納された2つの数値を乗算しようとしていると正しく指摘しました。その場合:

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)
于 2013-07-01T23:01:39.107 に答える