redis执行Lua脚本报"attempt to compare number with string"错误的解决方法

来源:互联网 发布:手柄要下载什么软件 编辑:程序博客网 时间:2024/05/01 00:22

最近在一段项目代码里执行一个redis脚本,脚本的作用是获取一个list键中的元素个数,并与设定值(输入参数)比较,如果元素个数小于设定值则返回。测试时发现该脚本会报"attempt to compare number with string"错误,简化的脚本如下:

localhost:6379> eval "local key_len = redis.call('LLEN', KEYS[1])   if key_len < ARGV[1] then return key_len end" 1 myKey 3
其中myKey就是要检测的list,设定的list长度为3。执行脚本后redis报错,说试图将数值与字符串相比较:

(error) ERR Error running script (call to f_a51f990b393ac7ebcc1132c458c355afbf8ccfa0): 
@user_script:1: user_script:1: attempt to compare number with string 

脚本中只有一处比较运算,"LLEN myKey"命令的返回值肯定是整数,那么这就说明不管你是想输入数值还是字符串,redis将所有的输入参数都设为了string类型。其实这也是高效的设计,因为只有程序员自己才知道自己设计脚本的目的,eval命令无法判断程序员到底是想输入数值3还是字符串"3"。所以,在执行与ARVG[1]的比较前,需要显式地调用Lua的tonumber()内建函数将ARGV[1]转化为number类型,脚本修改如下:

localhost:6379> eval "local key_len = redis.call('LLEN', KEYS[1]) if key_len < tonumber(ARGV[1]) then return 0 end" 1 myKey 3
再次运行脚本执行正确。


0 0
原创粉丝点击