Redis和Lua使用过程中遇到的小问题
问题
在Redis里执行get或hget不存在的key或field时返回值在终端显式的是(nil),类似于下面这样
127.0.0.1:6379>gettest_version (nil)
如果在Lua脚本中判断获取到的值是否为空值时,就会产生比较迷惑的问题,以为判断空值的话就用nil就可以了,然鹅事实却并不是这样的,如下所示:
127.0.0.1:6379>gettest_version (nil) 127.0.0.1:6379>EVAL"locala=redis.call('get',KEYS[1])print(a)ifa=='nil'thenreturn1elsereturn0end"1test_versiontest_version (integer)0
我们来看下执行Lua脚本返回结果的数据类型是什么
127.0.0.1:6379>gettest_version (nil) 127.0.0.1:6379>EVAL"locala=redis.call('get',KEYS[1])returntype(a)"1test_versiontest_version "boolean"
通过上面的脚本可以看到,当Redis返回的结果为(nil)时候,其真实的数据类型为boolean,因此我们直接判断nil是有问题的。
Redis官方文档
通过翻阅官方文档,找到下面所示的一段话,
RedistoLuaconversiontable.
- Redisintegerreply->Luanumber
- Redisbulkreply->Luastring
- Redismultibulkreply->Luatable(mayhaveotherRedisdatatypesnested)
- Redisstatusreply->Luatablewithasingleokfieldcontainingthestatus
- Rediserrorreply->Luatablewithasingleerrfieldcontainingtheerror
- RedisNilbulkreplyandNilmultibulkreply->Luafalsebooleantype
LuatoRedisconversiontable.
- Luanumber->Redisintegerreply(thenumberisconvertedintoaninteger)
- Luastring->Redisbulkreply
- Luatable(array)->Redismultibulkreply(truncatedtothefirstnilinsidetheLuaarrayifany)
- Luatablewithasingleokfield->Redisstatusreply
- Luatablewithasingleerrfield->Rediserrorreply
- Luabooleanfalse->RedisNilbulkreply.
解决方案
通过官方文档,我们知道判断Lua脚本返回空值使用,应该直接判断true/false,修改判断脚本如下所示
127.0.0.1:6379>gettest_version (nil) 127.0.0.1:6379>EVAL"locala=redis.call('get',KEYS[1])ifa==falsethenreturn'empty'elsereturn'notempty'end"1test_versiontest_version "empty"
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。