springboot redis执行lua脚本报错:@user_script:1: ERR value is not an integer or out of range

2 篇文章 0 订阅

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;

完美执行。有知道原因的小伙伴请告知一二

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值