Hello!
2016-05-05 6:22 GMT-07:00 锐蓝:
> 在使用lua redis模块的时候发现以下比较棘手的情况,由于项目代码比较复杂,使用以下为伪码进行演示。
>
> local ok, err = red:connect("127.0.0.1", 6379)
> local start = ngx.now()
> local res, err = red:get("dog")
> local end = ngx.now()
>
> 经测试,get指令完成大部分时候都需要200多毫秒才能返回结果。
> 目前已经排查,redis进程CPU正常。不管是使用自己搭建的redis进程,还是使用第三方的云储存提供的redis服务器,测试耗时接近。请指点以下疑惑,不胜感谢。
看起来像是计时精度的问题。ngx.now() 是有误差的,因为使用了nginx 自身的时间缓存。对于精度要求较高的计时,应使用下面的调用序列:
ngx.update_time()
local now = ngx.now()
值得一提的是,ngx.now() 只有毫秒精度。
另外,确保你*没有*在 nginx.conf 里面配置 timer_resolution 指令,见
http://nginx.org/en/docs/ngx_core_module.html#timer_resolution
如果你确认不是计时方法的问题,请提供一个最小化的完整示例,以便我可以在本地复现问题。伪码显然是无法进行可靠的分析和调试的,只能靠猜了。
另外,建议加入 openresty 中文邮件列表讨论这样的问题,谢谢合作!请见
https://openresty.org/en/community.html 同时抄送给该列表。
Regards,
-agentzh