2013-06-29 35 views
3

我想使用Lua腳本將存儲在Redis中的兩個數字相乘。但是我得到了ClassCastException。可能有人指出,這有什麼不對的程序如何在使用Lua腳本的Redis中處理數字

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

你不能在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) 
+0

其實我想在這兩個鍵兩個數相乘,我已經改變了腳本的最後一行(刪除#) 回報first_key * second_key,和它的工作。謝謝。在上面的程序中,redis.call()返回一個String類型而不是表格。 – user1182253

相關問題