这篇文章主要给大家介绍了关于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"

总结

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

最新资讯
5G新标准补齐“能力三角” 工业互联网加速启动

5G新标准补齐“能力三

随着全球首个以物联网场景为主的5G标准R16的冻结,工业
捷足先登“拿下”神州租车:上汽大出行版图已现

捷足先登“拿下”神州

上汽香港拟以每股3.10港币的价格以现金出资方式收购神
中芯国际回A倒计时:科创板募资或超500亿元

中芯国际回A倒计时:科

对于中芯国际的发行价,业内此前多有讨论,并普遍参考科创
5G R16标准冻结  B端应用大幕开启

5G R16标准冻结 B端

国际标准组织3GPP冻结了5G R16标准,而R16着重对高可靠
中芯国际上市交易倒计时 网上路演聚焦未来成长性

中芯国际上市交易倒计

在网上投资者交流会上,中芯国际与投资者就该公司业务状
小电抢跑共享充电宝第一股

小电抢跑共享充电宝第

共享充电宝服务商“小电科技”(以下简称“小电”)已同浙
最新文章
从一个小需求感受Redis的独特魅力(需求设计)

从一个小需求感受Redi

Redis在实际应用中使用的非常广泛,本篇文章就从一个简
详解redis desktop manager安装及连接方式

详解redis desktop ma

这篇文章主要介绍了redis desktop manager安装及连接
Redis集群下过期key监听的实现代码

Redis集群下过期key监

这篇文章主要介绍了Redis集群下过期key监听的实现代码
Redis集群增加节点与删除节点的方法详解

Redis集群增加节点与

这篇文章主要给大家介绍了关于Redis集群增加节点与删
Linux 下redis5.0.0安装教程详解

Linux 下redis5.0.0安

这篇文章主要介绍了Linux 下redis5.0.0安装教程,本文图
Redis 实现“附近的人”功能

Redis 实现“附近的人

Redis基于geohash和有序集合提供了地理位置相关功能。