springboot整合redis使用RedisTemplate执行lua脚本报错:@user_script:1: ERR value is not an integer or out of range
执行代码(该段代码是获取锁的一段脚本)如下:
@Autowired
private RedisTemplate redisTemplate;
。。。中间省略部分代码
String evalScript = new StringBuilder()
.append(" if redis.call('setnx', KEYS[1], ARGV[1])==1 then")
.append(" if redis.call('get', KEYS[1])==ARGV[1] then")
.append(" return redis.call('expire', KEYS[1], ARGV[2])")
.append(" else return 0")
.append(" end")
.append(" else return 0")
.append(" end").toString();
RedisScript redisScript = new DefaultRedisScript(evalScript, Long.class);
Object result = redisTemplate.execute(redisScript, Arrays.asList(key), String.valueOf(value), String.valueOf(timeOut));
if ((long) result == 1) {
// 获取锁成功
return true;
} else {
log.info("获取锁失败,key为:{}", key);
return false;
}
详细错误信息如下:
org.springframework.dao.InvalidDataAccessApiUsageException: ERR Error running script (call to f_f2ea07e139c52a87b41289d62d86e642356eb5c5): @user_script:1: ERR value is not an integer or out of range ; nested exception is redis.clients.jedis.exceptions.JedisDataException: ERR Error running script (call to f_f2ea07e139c52a87b41289d62d86e642356eb5c5): @user_script:1: ERR value is not an integer or out of range
at org.springframework.data.redis.connection.jedis.JedisExceptionConverter.convert(JedisExceptionConverter.java:64)
at org.springframework.data.redis.connection.jedis.JedisExceptionConverter.convert(JedisExceptionConverter.java:41)
at org.springframework.data.redis.PassThroughExceptionTranslationStrategy.translate(PassThroughExceptionTranslationStrategy.java:37)
at org.springframework.data.redis.FallbackExceptionTranslationStrategy.translate(FallbackExceptionTranslationStrategy.java:37)
at org.springframework.data.redis.connection.jedis.JedisConnection.convertJedisAccessException(JedisConnection.java:241)
at org.springframework.data.redis.connection.jedis.JedisConnection.evalSha(JedisConnection.java:3657)
at org.springframework.data.redis.connection.jedis.JedisConnection.evalSha(JedisConnection.java:3642)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.data.redis.core.CloseSuppressingInvocationHandler.invoke(CloseSuppressingInvocationHandler.java:57)
at com.sun.proxy.$Proxy135.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:207)
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:169)
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:157)
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:300)
at cn.reg.stages.redis.base.JedisUtils.lock(JedisUtils.java:99)
at cn.reg.stages.redis.base.service.impl.RedisLockServiceImpl.getRegisterDomainLock(RedisLockServiceImpl.java:320)
at cn.reg.stages.domain.service.DomainBasicServiceImpl.createDomain(DomainBasicServiceImpl.java:65)
at cn.reg.stages.domain.service.DomainBasicServiceImpl$$FastClassBySpringCGLIB$$9a2f7472.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:669)
at cn.reg.stages.domain.service.DomainBasicServiceImpl$$EnhancerBySpringCGLIB$$16f614ae.createDomain(<generated>)
at cn.reg.stages.domain.task.service.DomainRegisterTaskServiceImpl.registerTask(DomainRegisterTaskServiceImpl.java:143)
at cn.reg.stages.domain.task.service.DomainRegisterTaskServiceImpl.lambda$null$0(DomainRegisterTaskServiceImpl.java:76)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: redis.clients.jedis.exceptions.JedisDataException: ERR Error running script (call to f_f2ea07e139c52a87b41289d62d86e642356eb5c5): @user_script:1: ERR value is not an integer or out of range
at redis.clients.jedis.Protocol.processError(Protocol.java:127)
at redis.clients.jedis.Protocol.process(Protocol.java:161)
at redis.clients.jedis.Protocol.read(Protocol.java:215)
at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340)
at redis.clients.jedis.Connection.getOne(Connection.java:322)
at redis.clients.jedis.BinaryJedis.evalsha(BinaryJedis.java:3142)
at org.springframework.data.redis.connection.jedis.JedisConnection.evalSha(JedisConnection.java:3655)
... 27 more
网上说什么返回值没有interger类型什么的,返回值有问题,但是处理了返回值之后还是一样错。最后,调整了redisTemplate依赖注入类型,就可以了,不知道什么原因导致的。希望可以帮到你们。
调整代码如下:
// 依赖注入调整成这个样子,就可以了
@Autowired
private RedisTemplate<String, String> redisTemplate;
完美执行。有知道原因的小伙伴请告知一二