场景还原
环境
- redission 3.14
- redisTemplate:Jackson2JsonRedisSerializer+StringRedisSerializer
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.14.1</version>
</dependency>
java关键代码
execute第二个参数为key的list,后面跟多参数,一个参数是一个value
String value = "100"
List<String> key = new ArrayList<>();
key.add("limit");
redisTemplate.execute(LUA_SCRIPT, keys, value); //返回String或者Long,根据测试需要进行sout
lua
local k = KEYS[1]
local v = tonumber(ARGV[1])
if v > 0 then
return 1;
else return 0;
end
执行时会报错v为nil
排查过程:
- 确保execute方法参数对应正确,因为jedis是jedis.eval(script, keys, args);//keys和args都是list
- value参数类型,确保是String
- 能读到ARGV[1],直接return ARGV[1],正确,返回"100"
- 确保type(ARGV[1])也是string
这就很疑惑了,ARGV[1]是数字样式的string,tonumber不应该返回Nil啊
关键进展
在#ARGV[1]之后,"100"长度为5,而不是3,
问题在于ARGV[1]是
- "“100"”
而不是 - “100”
tonumber("“100"”)那当然是nil,继续探究问题,在搜索引擎搜索的时候加上关键字”引号“就容易找到类似问题了,因为使用了Jackson对进行序列化,String会自动加上一对引号
解决方案:
execute使用org.springframework.data.redis.serializer.StringRedisSerializer而不是自己修改的那个Bean