OpenResty数据共享总结

总结见如下表格:

数据共享方法 数据的生命周期 可使用的上下文(context) 支持的数据类型 特点
ngx.ctx API 单个请求级别但不能跨location init_worker, set, rewrite, access, content, header_filter, body_filter, log, balancer, ngx.timer.* 任何lua对象 数据查询速度比ngx.var
ngx.var API 单个请求级别且可跨location set, rewrite, access, content, header_filter, body_filter, log 字符串类型 如果不考虑使用外部数据库方案的话, 这个API是lua代码和Nginx C模块之间共享数据的唯一方法. 对于lua复杂对象, 通过序列化和反序列化和lua程序进行数据交互
lua 自定义全局变量 单个worker下的所有请求 所有执行阶段 任何lua对象 容易造成racecondition; 不推荐使用或者说一定不要使用
模块级别变量 单个worker下的所有请求 所有执行阶段 任何lua对象 变量只能定义在模块中, 通过require模块使用变量
resty.lrucache 单个worker下的所有请求 所有执行阶段 任何lua对象 只能用于模块中, 通过require模块来使用
变量传参给回调函数 在一个功能模块的各个执行阶段共享数据: 1.在init_by_lua*阶段给该变量赋的值, 是server级别的; 2.在init_worker_by_lua*阶段给变量赋的值,是单个worker级别的; 3.其他阶段给变量赋的值, 单个请求级别的, 且不能跨location. 所有执行阶段 任何lua对象 相同功能模块的不同执行阶段共享数据
ngx.shared.DICT API server级别, 即所有worker之间共享数据 init, init_worker, set,rewrite, access, content, header_filter, body_filter, log, ngx.timer.*, balancer, ssl_certificate, ssl_session_fetch, ssl_session_store 字符串类型 对于lua复杂对象, 通过序列化和反序列化和lua程序进行数据交互
数据库服务 server级别 所有执行阶段 字符串类型 对于lua复杂对象,通过序列化和反序列化和lua程序进行数据交互