首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么resty.redis不能与ngx.timer一起工作?

为什么resty.redis不能与ngx.timer一起工作?
EN

Stack Overflow用户
提问于 2021-01-26 02:44:34
回答 1查看 668关注 0票数 0

我已经问过这里了,但我想我也会发这样的帖子:

鉴于这一守则:

代码语言:javascript
复制
local redis = require('resty.redis')

local client = redis:new()
client:connect(host,port)
ngx.thread.spawn(function()
  ngx.say(ngx.time(),' ',#client:keys('*'))
end)
ngx.timer.at(2,function()
  ngx.say(ngx.time(),' ',#client:keys('*'))
end)

我知道这个错误:

代码语言:javascript
复制
---urhcdhw2pqoz---
1611628086 5
2021/01/26 10:28:08 [error] 4902#24159: *4 lua entry thread aborted: runtime error: ...local/Cellar/openresty/1.19.3.1_1/lualib/resty/redis.lua:349: bad request
stack traceback:
coroutine 0:
    [C]: in function 'send'
    ...local/Cellar/openresty/1.19.3.1_1/lualib/resty/redis.lua:349: in function 'keys'
    ./src/main.lua:20: in function <./src/main.lua:19>, context: ngx.timer

因此,线程似乎与redis一起工作,但定时器不起作用。为什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-26 18:06:59

代码中有两个错误。

  1. 不可能在Lua处理程序之间传递cosocket对象(我添加了重点): 这个API函数创建的cosocket对象与创建它的Lua处理程序具有完全相同的生存期。因此,不要将cosocket对象传递给任何其他Lua处理程序(包括ngx.timer回调函数),也不要在不同的Nginx请求之间共享cosocket对象。

https://github.com/openresty/lua-nginx-module#ngxsockettcp

在您的示例中,对cosocket对象的引用存储在client表(client._sock)中。

  1. ngx.print/ngx.sayngx.timer.*上下文中不可用。 https://github.com/openresty/lua-nginx-module#ngxsay (查看上下文:部分)。 您可以使用ngx.log代替(它写入nginx日志,在nginx.conf中设置error_log stderr debug;以将日志打印到stderr)。

下列代码按预期工作:

代码语言:javascript
复制
ngx.timer.at(2, function()
  local client = redis:new()
  client:connect('127.0.0.1' ,6379)
  ngx.log(ngx.DEBUG, #client:keys('*'))
end)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65895230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档