作者回复: 多谢补充 :)
作者回复: 有两个原因:一个是 LuaJIT 的作者基本处于退休状态,只修 bug,不怎么加新功能,关于 LuaJIT 的 bug,OpenResty 还是会提交给LuaJIT 官方的;第二个是新增的主要是 OpenResty 优化中遇到的 API,自己维护更容易控制版本和节奏。
作者回复: 这里的字节码是 LuaJIT 虚拟机执行的一种指令格式;机器码是指 CPU 可以读取的指令格式。
作者回复: 我建议大家绕着走,把 nil 改为 ngx.null 来填充数组。不同的 lua 版本会有不同的行为,我也不太清楚。
作者回复: 主要是OpenResty 中空值的情况比较多
作者回复: 后面有专门的限流限速章节
作者回复: 在 lua-resty-redis 里面,查找一个key 的时候:
local res, err = red:get("dog")
如果返回值 res 是 nil,就说明函调用失败了;如果 res 是 ngx.null 就说明redis 中不存在 dog 这个key。
而在处理 cjson 的时候,又有cjson.null这个值。
所以还是要根据对应库的文档来做空值的判断和区分。
在写类似 if not res then 这样的代码的时候,要特别留意下,最好改成明确的: if res ~= nil and res ~= false then ,类似这样的,并有对应的测试案例覆盖。
作者回复: LuaJIT 是会记录并统计代码的运行次数,才能知道哪些是热函数和热循环,这就是“尝试”的含义;
如果有些函数只调用了一两次,就没有编译的必要性了;
第三个问题,我的猜测可能是处于安全或者类似的考虑,就没有写死一个值,而是随机。