今天遇到一个麻烦的问题,查询redis时候,查到数据的时候正常返回,查询不到数据时,返回了null,然而在lua中,常见的nil,但不常见null,这时候lua中对redis返回的null如何做判断呢?
于是各种尝试。
这是经过公司基础库封装的结果,并非官方的返回,redis返回结果如下:

{"retmsg":"","result":null,"retcode":"0000"}

开始尝试了这样常规的判断,把获取的result当成字符串null,直接判断null,都已失败告终。显而易见,这个null没有双引号,lua type返回结果也没有null,最终用此方法解决

if res.result == ngx.null then
tools.logs("result is null")
end

ngx.null是什么?

那么ngx.null到底是什么东西呢? 在http://wiki.nginx.org/HttpLuaModule有如下说明:

The ngx.null constant is a NULL light userdata usually used to
represent nil values in Lua tables etc and is similar to the
lua-cjson library’s cjson.null constant. This constant was first
introduced in the v0.5.0rc5 release.

ngx.null在print、ngx.print、ngx.log、ngx.say等函数中,有如下特点:

Lua nil arguments are accepted and result in literal “nil” strings
while Lua booleans result in literal “true” or “false” strings. And
the ngx.null constant will yield the “null” string output.

为什么要这么设计?

lua-resty-redis中,为什么要把redis查询为空的情况返回一个userdata类型的ngx.null?直接返回nil不行吗?

答案是不行,因为nil在lua中有其特殊意义,如果一个变量被设置为nil,就等于说该变量未定义,与无穷无尽的其他未定义的变量一样。那么,如果把redis查询为空的结果设置为nil,就无法把”查询为空”和“未定义”区分开来了,例如在一个table中,一个key对应一个value,如果将该value设置为nil,则相当让key凭空消失,这显然是不合理的。所以必须用一个userdata类型的独特的值来表示这种查询为空,但又不等同于未定义的变量,例如ngx.null。同样的情况想必在sql的lua模块中也会出现,用来处理记录中键值查询为空的情况。

lua中table中null的表示方法以及判断redis返回null的更多相关文章

  1. in not in 和 null , in 判断范围中可以包含null,而not in判断不能包括null

    oracle中,任何字符串与null比较得到的结果都是null,而 oracle的判断条件为null时就退出判断(?) 因此判断某个字符串是否在一个集合中时,not in 和 in的结果完全不一样,如 ...

  2. lua中 table 重构index/pairs元方法优化table内存占用

    转载请标明出处http://www.cnblogs.com/zblade/ lua作为游戏的热更新首选的脚本,其优势不再过多的赘述.今天,我主要写一下如何重写lua中的元方法,通过自己的重写来实现对l ...

  3. lua的table转为excel表格的方法

    项目中需要用到转表工具,由于没有直接的转表工具,而且嵌套的table(table里面嵌套了多层表格与数组).无奈之下,只好采用折衷的方法,先将table表格转为json数据,再用在线转表工具将json ...

  4. C++ 中dynamic_cast<>的使用方法小结 -判断类型-rtti

    将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理          即会作一定的判断.        对指针进行dynamic ...

  5. 关于页面中table中相同的列自动合并

    代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  6. 数据表中记录明明有,session.get(类.class, id);返回null

    出现null的处理思路首先检查数据库中是否真的有这个记录 确实存在的,用接口查一下最大值,也是存在的,数据库连接正常 写sql也可以查得到 然而诡异的事情出现了 难道是一直在用的dao代码出了问题? ...

  7. java8之list集合中取出某一属性的方法

    上代码 List<User> list = new ArrayList<User>(); User user1 = new User("第一位"," ...

  8. lua的table表处理 及注意事项

    lua,一款很轻量级很nice很强大的脚本语言,做为lua中使用最为频繁的table表,在使用之时还是有颇多的好处与坑的: 下面是大牛 云风的一片关于lua table的blog,可使得对lua ta ...

  9. lua的table表去重

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321  我的个人博客 方法一 用过lua的人都知道,lua的table中不允许存在相同的key,利用这个思想,我们可以将原始table ...

  10. Android 成功 使用GPS获取当前地理位置(解决getLastKnownLocation 返回 null)

    最近遇到一个比较棘手的问题:使用GPS定位无法获取当前的地理位置,即getLastKnownLocation方法始终返回null.   后来一篇博文 getLastKnownLocation()返回n ...

随机推荐

  1. win10找不到无线网络报错:Windows无法自动将IP协议堆栈绑定到网络适配器

    win10找不到无线网络报错:Windows无法自动将IP协议堆栈绑定到网络适配器 问题描述: 今天启动电脑,忽然发现连不上WIFI了,但可以拨号连接有线网.大致情况如下: 上图是修复后的结果,在未修 ...

  2. 【YashanDB知识库】statement级别的触发器在jdbc接口调用executeBatch时被多次触发

    问题现象 某客户使用jdbc接口向yashandb的表A插入数据. 表A上有一个语句级触发器,其内容为在触发时执行alter sequence操作:另外还有一个insert时的行级触发器,其内容为将每 ...

  3. Argo CD初体验

    什么是 Argo CD? Argo CD 是一个声明式的 GitOps 持续交付工具,用于 Kubernetes 集群.它通过持续监控 Git 仓库中的 Kubernetes 资源配置文件,将这些配置 ...

  4. Figma 学习笔记 – Team Library Style and Component

    Design System 我们做设计通常会 Follow 一个 Design System, 比如 Material Guide. 里头会定义 Font, Color, Effect (Elevat ...

  5. Java中使用BigDecimal进行double类型的计算(高精度,可保留几位小数)

    Java中 小数直接进行乘除运算,会出现精度问题导致计算结果有误需要使用 BigDecimal 类型辅助运算,保证精度无误源码: import java.math.BigDecimal;import ...

  6. Advanced .Net Debugging 11:完结篇

    一.介绍 这是我的<Advanced .Net Debugging>这个系列的第十一篇文章,也是这个系列的最后一篇了.我已经把原书的前八章内容全部写完了,本来打算继续写第九章和第十章的内容 ...

  7. [30] CSP 加赛 1

    A.小W与伙伴招募 考虑贪心,可以发现,每一天只需要优先选择价值低的即可 这种贪心思路有一个错误的扩展,就是先把 \(m\) 天的货一次性补齐再一次性买,这样做的问题在于有可能买到次日的货,而这样做是 ...

  8. foobar2000 v1.6.11 汉化版(更新于 2022.08.25)

    foobar2000 v1.6.11 汉化版 -----------------------[软件截图]---------------------- -----------------------[软 ...

  9. 一生财运三世书财运测算api接口免费版_json格式数据获取

    ‌三世书财运是根据生辰八字推算出的一个人今生的财运状况,它认为人的财运受到前世因果的影响,同时也会受到今生行为的影响.‌这种算命方法起源于佛教的<三世因果经>,据说可以推演一个人的前世.今 ...

  10. python:将文件从一个目录移动到另一个目录。附:nnUnet使用

    在使用nn-Unet做BraTS2019数据集预测时,预测文件分别生成了三类文件:.pkl  .npz  .nii.gz,我们需要的是.nii.gz文件.所以需要进行文件移动. # coding:ut ...