2016-11-10 21 views
2

我用LUA腳本:春天的Redis:如何通過到期時間價值

local lock = redis.call('get', KEYS[1]) 
if not lock then  
    return redis.call('SETEX', KEYS[1], ARGV[1] ,ARGV[2]); 
end 
return false 

從春天啓動應用程序,我用它來打電話的Redis與腳本

DefaultRedisScript<Boolean> redisScript = new 
DefaultRedisScript<Boolean>(); 
redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("checkandset2.lua"))); 
redisScript.setResultType(Boolean.class); 
System.out.println(redisTemplate.execute(redisScript , Collections.singletonList("value123"),"10" ,"key123")); 

我總是異常:

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String 
at org.springframework.data.redis.serializer.StringRedisSerializer.serialize(StringRedisSerializer.java:32) 
at org.springframework.data.redis.core.script.DefaultScriptExecutor.keysAndArgs(DefaultScriptExecutor.java:116) 
at org.springframework.data.redis.core.script.DefaultScriptExecutor$1.doInRedis(DefaultScriptExecutor.java:63) 
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:202) 
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:164) 
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:152) 
at org.springframework.data.redis.core.script.DefaultScriptExecutor.execute(DefaultScriptExecutor.java:60) 
at org.springframework.data.redis.core.script.DefaultScriptExecutor.execute(DefaultScriptExecutor.java:54) 
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:298) 
at com.masary.ledger.ResisScriptTestClass.msisdnJustRechargedException(ResisScriptTestClass.java:34) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

當我使用

System.out.println(redisTemplate.execute(redisScript, Collections.singletonList(「value123」),new Long(10),「key123」));

我得到異常

 org.springframework.data.redis.RedisSystemException: Unknown redis exception; nested exception is java.lang.ClassCastException: [B cannot be cast to java.lang.Long 
     at org.springframework.data.redis.FallbackExceptionTranslationStrategy.getFallback(FallbackExceptionTranslationStrategy.java:48) 
     at org.springframework.data.redis.FallbackExceptionTranslationStrategy.translate(FallbackExceptionTranslationStrategy.java:38) 
     at org.springframework.data.redis.connection.jedis.JedisConnection.convertJedisAccessException(JedisConnection.java:212) 
     at org.springframework.data.redis.connection.jedis.JedisConnection.evalSha(JedisConnection.java:3173) 
     at org.springframework.data.redis.connection.jedis.JedisConnection.evalSha(JedisConnection.java:3158) 
     at org.springframework.data.redis.connection.DefaultStringRedisConnection.evalSha(DefaultStringRedisConnection.java:1374) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at org.springframework.data.redis.core.CloseSuppressingInvocationHandler.invoke(CloseSuppressingInvocationHandler.java:57) 
     at com.sun.proxy.$Proxy182.evalSha(Unknown Source) 
     at org.springframework.data.redis.core.script.DefaultScriptExecutor.eval(DefaultScriptExecutor.java:81) 
     at org.springframework.data.redis.core.script.DefaultScriptExecutor$1.doInRedis(DefaultScriptExecutor.java:71) 
     at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:202) 
     at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:164) 
     at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:152) 
     at org.springframework.data.redis.core.script.DefaultScriptExecutor.execute(DefaultScriptExecutor.java:60) 
     at org.springframework.data.redis.core.script.DefaultScriptExecutor.execute(DefaultScriptExecutor.java:54) 
     at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:298) 
     at com.masary.ledger.ResisScriptTestClass.msisdnJustRechargedException(ResisScriptTestClass.java:34) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
. 
. 
    Caused by: java.lang.ClassCastException: [B cannot be cast to java.lang.Long 
     at org.springframework.data.redis.connection.jedis.JedisScriptReturnConverter.convert(JedisScriptReturnConverter.java:53) 
     at org.springframework.data.redis.connection.jedis.JedisConnection.evalSha(JedisConnection.java:3171) 
     ... 46 more 

哪能時間值期滿傳遞到Lua腳本有什麼建議?

回答

0

我是一個新手,並且有類似的問題。嘗試發送字符串"10",而不是Long。爲我工作。