OpenResty实战之数据共享

  Seves

本文链接:OpenResty实战之数据共享

本文主要介绍如何在OpenResty中实现数据共享,主要介绍三种方法:lua_shared_dict、ngx.ctx、配置文件

1、概述

处理用户请求中,经常会有不同的数据共享需求,有二个场景

  • 不同工作进程间共享
  • 同一进程不同阶段共享

另外,共享的数据根据操作还分为

  • 只读
  • 读写

2、实现方法

实现方法有三种

  • lua_shared_dict
  • ngx.ctx
  • require引用数据脚本

3、应用场景

  • lua_shared_dict可以用于不同工作进程间共享数据。所有工作进程共享一块内存区。
  • ngx.ctx可以用于单个请求内同一工作进程不同阶段共享数据。单个请求内的 rewrite (重写),access (访问),和 content (内容) 等各处理阶段是保持一致的。另外,要注意的是,每个请求,包括子请求,都有一份自己的 ngx.ctx 表
  • require引用一个数据脚本,可以用于共享数据只读的情形,每个工作进程在初始阶段就通过引用一个初始化数据的脚本完成数据初始化。需要注意的是,一定要在nginx.conf中设置lua_code_cache 开启,这样只会在第一次请求时初始化数据,后续所有请求都会共享初始化的数据,不会重复初始化,影响性能。

4、应用示例

1) lua_shared_dict

http {
    lua_shared_dict dogs 10m;
    server {
    location /set {
        content_by_lua '
          local dogs = ngx.shared.dogs
          dogs:set("Jim", 8)
          ngx.say("STORED")
        ';
    }
    location /get {
        content_by_lua '
          local dogs = ngx.shared.dogs
          ngx.say(dogs:get("Jim"))
        ';
    }
   }
}

2) ngx.ctx

location /test {
     rewrite_by_lua '
         ngx.ctx.foo = 76
     ';
     access_by_lua '
         ngx.ctx.foo = ngx.ctx.foo + 3
     ';
     content_by_lua '
         ngx.say(ngx.ctx.foo)
     ';
 }


3) require

可能用到的一个场景是读取配置文件,让每个工作进程按照配置文件的配置工作。

  • 开启lua 代码缓存
server {
            listen 8888;
            lua_code_cache on;
            location / {
                default_type text/html;
                content_by_lua_file src/core/unlike.lua;
            }
        }
  • 读取配置文件,以json配置为例
local PJ={}
parse_json = PJ

local DEFINE = require("define")
local file = io.open("/data0/unlike/src/conf/config_data.json", "r");
assert(file);
local file_data = file:read("*a"); -- 读取所有内容
file:close();

local json = require("cjson.safe")
PJ.data = json.decode(file_data)
if not PJ.data then
ngx.log(ngx.ERR,"json decode nil")
end

return parse_json
  • require文件
PJ = require ("parse_json")

参考

转自:Lua OpenResty共享数据实现方法

本文链接:https://www.tech-field.org/OpenResty-with-data-share.html

fc