Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot SpringRedis运行脚本:如何传递到期时间值_Spring Boot_Lua_Redis_Spring Data_Spring Data Redis - Fatal编程技术网

Spring boot SpringRedis运行脚本:如何传递到期时间值

Spring boot SpringRedis运行脚本:如何传递到期时间值,spring-boot,lua,redis,spring-data,spring-data-redis,Spring Boot,Lua,Redis,Spring Data,Spring Data Redis,我使用lua脚本: local lock = redis.call('get', KEYS[1]) if not lock then return redis.call('SETEX', KEYS[1], ARGV[1] ,ARGV[2] ); end return false 从SpringBoot应用程序中,我使用脚本调用redis DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript&

我使用lua脚本:

local lock = redis.call('get', KEYS[1])
if not lock then    
    return redis.call('SETEX', KEYS[1], ARGV[1] ,ARGV[2] );
end
return false
从SpringBoot应用程序中,我使用脚本调用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"));
当我使用

System.out.println(redisTemplate.execute)(redisScript, 集合。单音列表(“value123”)、新长(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脚本?

我自己也是新手,也遇到过类似的问题。尝试发送字符串
“10”
,而不是
长的
。为我工作

这条线索可能很旧,但可能对其他偶然发现这一点的人有所帮助

对我来说,原因是使用
JdkSerializationRedisSerializer
作为值序列化程序,比如:
redisTemplate.setValueSerializer(新的jdkserizationredisserializer())
,这也是默认值

要解决此问题,请参见下面的解决方案:

private static void redievalforexpire(字符串scriptText,列表键,对象[]argv){
//由于spring boot将数据序列化为-“\xac\xed\x00\x05t\x00\x0”,因此redis无法将其识别为整数
执行(新建DefaultRedisScript(scriptText)、新建StringRedisSerializer()、新建StringRedisSerializer()、键、argv);
}
这表示对任何值使用
StringRedisSerializer
,因此当我们设置2时,使用
JdkSerializationRedisSerializer
,2序列化为类似以下内容:

“\xac\xed\x00\x05sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x02”

但是当我们说使用
StringRedisSerializer
时,2作为
“2”
发送,Redis很容易识别

     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