我正在与open-resty和lua一起创建用于重定向请求的服务器。重定向是基于lua数据树结构(嵌套表)中的某些数据完成的
我正在寻找一种在启动时填充这些数据,然后在工作人员之间共享数据的方法。
ngx.ctx可以保存任意数据,但仅在请求期间持续。 共享字典持续到最后,但只能保存基元列表。
我读到可以跨lua模块共享数据。因为模块在启动时仅实例化一次。代码是这样的
local _M = {}
local data = {
dog = {"value1", "value4"},
cat = {"value2", "value5"},
pig = {"value3", "value6"}
}
function _M.get_age(name)
return data[name]
end
return _M
,然后进入nginx.conf
location /lua {
content_by_lua_block {
local mydata = require "mydata"
ngx.say(mydata.get_age("dog"))
}
}
此第三种可能性线程安全吗? 还有其他方法可以实现这一目标吗?
关于此的文档不多,这就是为什么将其发布在这里。 任何信息都会有所帮助, 谢谢
答案 0 :(得分:1)
您可以在init_by_lua
中填充数据,以后再访问。在您的情况下,mydata
模块的初始化可以通过以下方式实现:
init_by_lua_block {
require "mydata"
}
init_by_lua
在nginx启动期间运行一次,然后将其分叉运行到worker中,因此每个进程都包含此数据的独立副本。
工作人员是单线程的,因此您可以安全地访问数据。
现在,如果您想在运行时修改配置,而无需重新加载nginx,则它会变得更加复杂。每个工作人员都是独立的,但是我们可以使用ngx.shared.DICT来传播更改。根据您的要求,可以使用两种解决方案:
如果您拥有应该可用的API,则可以使用lua-resty-lock创建跨工作人员的关键部分来同步修改。