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

 更新时间:2019年11月06日 08:37:21   作者:代码星冰乐  
这篇文章主要给大家介绍了关于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.

  • Redis integer reply -> Lua number
  • Redis bulk reply -> Lua string
  • Redis multi bulk reply -> Lua table (may have other Redis data types nested)
  • Redis status reply -> Lua table with a single ok field containing the status
  • Redis error reply -> Lua table with a single err field containing the error
  • Redis Nil bulk reply and Nil multi bulk reply -> Lua false boolean type

Lua to Redis conversion table.

  • Lua number -> Redis integer reply (the number is converted into an integer)
  • Lua string -> Redis bulk reply
  • Lua table (array) -> Redis multi bulk reply (truncated to the first nil inside the Lua array if any)
  • Lua table with a single ok field -> Redis status reply
  • Lua table with a single err field -> Redis error reply
  • Lua boolean false -> Redis Nil bulk reply.

解决方案

通过官方文档,我们知道判断 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中热key问题该如何解决

    redis中热key问题该如何解决

    这篇文章主要给大家介绍了关于redis中热key问题该如何解决的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • Redis配合SSDB实现持久化存储代码示例

    Redis配合SSDB实现持久化存储代码示例

    这篇文章主要介绍了Redis配合SSDB实现持久化存储代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Redis哨兵模式的实现

    Redis哨兵模式的实现

    Redis的哨兵模式是一种用于自动监控Redis实例状态并在主服务器出现故障时自动切换到从服务器的机制,本文主要介绍了Redis哨兵模式的实现,感兴趣的可以了解一下
    2024-02-02
  • Redis 命令整理并说明如何使用

    Redis 命令整理并说明如何使用

    这篇文章主要介绍了Redis 命令整理并说明如何使用的相关资料,需要的朋友可以参考下
    2017-02-02
  • redis通过6379端口无法连接服务器(redis-server.exe闪退)

    redis通过6379端口无法连接服务器(redis-server.exe闪退)

    这篇文章主要介绍了redis通过6379端口无法连接服务器(redis-server.exe闪退),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Redis 通过 RDB 方式进行数据备份与还原的方法

    Redis 通过 RDB 方式进行数据备份与还原的方法

    这篇文章主要介绍了Redis 通过 RDB 方式进行数据备份与还原,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Redis实现高并发计数器

    Redis实现高并发计数器

    这篇文章主要为大家详细介绍了Redis实现高并发计数器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • 详解Redis数据结构之跳跃表

    详解Redis数据结构之跳跃表

    这篇文章主要介绍了Redis数据结构中的跳跃表的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • redis中hash表内容删除的方法代码

    redis中hash表内容删除的方法代码

    在本篇文章里小编给各位整理了关于redis中hash表内容怎么删除的方法以及技巧代码,需要的朋友们分享下。
    2019-07-07
  • redis实现计数器-防止刷单方法介绍

    redis实现计数器-防止刷单方法介绍

    本文主要向大家介绍了redis实现计数器防止刷单的方法和有关代码,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11

最新评论