在 nginx 共享内存中存储嵌套表
Storing nested tables in nginx shared memory
我正在使用 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"))
}
}
这第三种可能性线程安全吗? 有没有别的东西可以实现这个?
这方面的文档不多,因此将其张贴在这里。 任何信息都会有所帮助, 谢谢
您可以在 init_by_lua
中填充您的数据,并在以后访问它。在您的情况下,mydata
模块的初始化可以通过以下方式实现:
init_by_lua_block {
require "mydata"
}
init_by_lua
运行s 在 nginx 启动期间执行一次,然后进程 运行 分叉到 worker 中,因此每个 worker 都包含此数据的独立副本。
工作人员 single-threaded,因此您可以安全地访问您的数据。
现在,如果您想在 运行 时修改您的配置,而不重新加载 nginx,那么它会变得有点复杂。每个 worker 都是独立的,但我们可以使用 ngx.shared.DICT 来传播更改。根据您的要求,您可以使用两种解决方案:
- 每次更改后将您的配置放入共享字典。创建一个计时器,定期从该共享缓存中重新加载工作人员的配置。
- 每次更改后,将您的配置连同当前时间戳或版本号一起放入共享字典中。在 worker 中的每个请求中,检查这个 timestamp/version 是否永远不会比本地缓存的那个 - 如果它反序列化这个配置并在本地缓存它。
如果您有一个应该可用的 API,那么您可以使用 lua-resty-lock 创建 cross-worker 个同步修改的临界区。