在Nginx共享内存中存储嵌套表

时间:2019-06-07 21:14:19

标签: nginx lua lua-table openresty lua-5.1

我正在与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"))
    }
}

此第三种可能性线程安全吗? 还有其他方法可以实现这一目标吗?

关于此的文档不​​多,这就是为什么将其发布在这里。 任何信息都会有所帮助, 谢谢

1 个答案:

答案 0 :(得分:1)

您可以在init_by_lua中填充数据,以后再访问。在您的情况下,mydata模块的初始化可以通过以下方式实现:

init_by_lua_block {
     require "mydata"
}

init_by_lua在nginx启动期间运行一次,然后将其分叉运行到worker中,因此每个进程都包含此数据的独立副本。

工作人员是单线程的,因此您可以安全地访问数据。


现在,如果您想在运行时修改配置,而无需重新加载nginx,则它会变得更加复杂。每个工作人员都是独立的,但是我们可以使用ngx.shared.DICT来传播更改。根据您的要求,可以使用两种解决方案:

  1. 每次更改后,将您的配置放入共享字典中。创建一个计时器,从该共享缓存中定期重新加载工作人员的配置。
  2. 每次更改后,将配置以及当前的时间戳或版本号放入共享字典中。对于工作程序中的每个请求,请检查此时间戳/版本是否永远比本地缓存的时间戳/版本好-如果要反序列化此配置并在本地缓存它。

如果您拥有应该可用的API,则可以使用lua-resty-lock创建跨工作人员的关键部分来同步修改。