openresty lua-resty-redis 封装 a wrapper for lua-resty-redis 优雅一点点

搜了一下别人的封装代码,感觉不够优雅,主要是 set_keepalive 的调用时机不太好

我自己下面的代码是利用 coroutine, 每次当前 phase 结束后自动调用 set_keepalive

local redis = require "resty.redis"

local M = {}


local function set_keepalive(p, red, opts)
        while true do
                if 'dead' == coroutine.status(p) then
                        break
                end
                ngx.sleep(0.01)
        end

        ok, err = red:set_keepalive(opts.freetime, opts.poolsize)
        if not ok then
                ngx.log(ngx.ERR, "failed to set keepalive: ", err)
                return
        end
end

function M:new(opts)
        opts = opts or {}
        opts.ip = opts.ip or '127.0.0.1'
        opts.port = opts.port or 6379
        opts.db = opts.db or 0
        opts.timeout = opts.timeout or 1000
        opts.poolsize = opts.poolsize or 100 -- 连接池大小 100 个
        opts.freetime = opts.freetime or 10 * 1000 -- 最大空闲时间 10s

        local red = redis:new()
        red:set_timeout(opts.timeout)

        local ok, err = red:connect(opts.ip, opts.port)
        if not ok then
            ngx.log(ngx.ERR, "failed to connect redis: ", err)
            return ok, err
        end

        -- local count, err = red:get_reused_times()
        -- ngx.log(ngx.ERR, "redis get_reused_times: ", count)


        local ok, err = red:select(opts.db)
        if not ok then
                ngx.log(ngx.ERR, "failed to select redis db: ", err)
                return ok, err
        end

        local t, err = ngx.thread.spawn(set_keepalive, coroutine.running(), red, opts)
        if not t then
                ngx.log(ngx.ERR, "failed to spawn thread set_keepalive: ", err)
                return t, err
        end

        return red
end

return M