2016-11-10 60 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。为我工作。