• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Redis和Lua使用过程中遇到的小问题

    问题

    在 Redis 里执行 get 或 hget 不存在的 key 或 field 时返回值在终端显式的是 (nil),类似于下面这样

    127.0.0.1:6379> get test_version
    (nil)

    如果在 Lua 脚本中判断获取到的值是否为空值时,就会产生比较迷惑的问题,以为判断空值的话就用 nil 就可以了,然鹅事实却并不是这样的,如下所示:

    127.0.0.1:6379> get test_version
    (nil)
    127.0.0.1:6379> EVAL "local a = redis.call('get',KEYS[1]) print(a) if a == 'nil' then return 1 else return 0 end" 1 test_version test_version
    (integer) 0

    我们来看下执行 Lua 脚本返回结果的数据类型是什么

    127.0.0.1:6379> get test_version
    (nil)
    127.0.0.1:6379> EVAL "local a = redis.call('get',KEYS[1]) return type(a)" 1 test_version test_version
    "boolean"

    通过上面的脚本可以看到,当 Redis 返回的结果为 (nil) 时候,其真实的数据类型为 boolean,因此我们直接判断 nil 是有问题的。

    Redis 官方文档

    通过翻阅官方文档,找到下面所示的一段话,

    Redis to Lua conversion table.

    Lua to Redis conversion table.

    解决方案

    通过官方文档,我们知道判断 Lua 脚本返回空值使用,应该直接判断 true/false,修改判断脚本如下所示

    127.0.0.1:6379> get test_version
    (nil)
    127.0.0.1:6379> EVAL "local a = redis.call('get',KEYS[1]) if a == false then return 'empty' else return 'not empty' end" 1 test_version test_version
    "empty"

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

    您可能感兴趣的文章:
    • 详解利用redis + lua解决抢红包高并发的问题
    • 简介Lua脚本与Redis数据库的结合使用
    • Redis执行Lua脚本的好处与示例代码
    • redis中如何使用lua脚本让你的灵活性提高5个逼格详解
    • 利用Lua定制Redis命令的方法详解
    • Redis如何使用lua脚本实例教程
    • Nginx利用Lua+Redis实现动态封禁IP的方法
    • 详解Redis中Lua脚本的应用和实践
    • 通过redis的脚本lua如何实现抢红包功能
    上一篇:Redis 实现“附近的人”功能
    下一篇:Redis中键值过期操作示例详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Redis和Lua使用过程中遇到的小问题 Redis,和,Lua,使用,过程中,