けつあご日記

tinojiはやみのふぃくさーにしかなりたくない.ひゃっぽゆずっててんほういは,あり.

Nginx(OpenResty)のLua shared dictionaryで無理やり配列を使う

配列はサポートされてないが、適当にシリアライザ/デシリアライザ的なの書いてやってみた。パフォーマンスはちゃんと見てないがまぁ動く。


サクッと試すnginx.confはこんな感じ。

worker_processes 12;

events {
    worker_connections 2048;
}


http {
    lua_shared_dict foo 10m;

    server {
        listen 80;

        location /test {
            content_by_lua_block {
                local function split(str, separator)
                    local result = {}
                    local pattern = '[^' .. separator .. ']+'

                    for tmp in string.gmatch(str, pattern) do
                        table.insert(result, tmp)
                    end

                    return result
                end

                local function trimBracket(str)
                    return (str:gsub("^{(.*)}$", "%1"))
                end

                local function arrayToString(array)
                    if #array == 0 then
                        return '{}'
                    end

                    return '{"' .. table.concat(array, '","') .. '"}'
                end

                local function removeQuatation(str)
                    local s = str:gsub('"', '')
                    return s:gsub("'", '')
                end

                local function stringToArray(str)
                    local s = trimBracket(str)
                    s = removeQuatation(s)
                    return split(s, ',')
                end

                local intbl = {"abc", "def"}
                -- add to shared
                ngx.shared.foo:add("key", arrayToString(intbl))
                ngx.say("stored")

                -- get from shared
                local outtbl = stringToArray(ngx.shared.foo:get("key"))
                ngx.say(table.concat(outtbl, ":"))
            }
        }
    }
}


マスタリングNginx

マスタリングNginx