java redis lua脚本 nil tonumber string

场景还原

环境

  • 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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值