如何在Lua中使我的redis连接成为单例?

我正在尝试通过Nginx和Lua处理传入的HTTP请求。我需要在每个请求中从Redis中读取蓝色,目前,我通过以下代码在每个请求中打开一个Redis连接:

local redis = require "resty.redis"
local red = redis:new()

local ok, err = red:connect("redis", 6379)
if not ok then
    ngx.say("连接失败:", err)
    return
end

local res, err = red:auth("abcd")
if not res then
    ngx.log(ngx.ERR, err)
    return
end

有没有办法使此连接静态或单例,以增加我的请求处理程序性能?

点赞
用户9783845
用户9783845

无法在不同的请求之间共享 cosocket 对象(因此也无法共享 redis 对象,请查看这份答案获取详细信息):

此 API 函数创建的 cosocket 对象与创建它的 Lua 处理器具有完全相同的生存期。因此,永远不要将 cosocket 对象传递给任何其他 Lua 处理器(包括 ngx.timer 回调函数),并且永远不要在不同的 Nginx 请求之间共享 cosocket 对象。

然而,nginx/ngx_lua 内部使用了连接池

在实际解析主机名并连接到远程后端之前,此方法始终会查找连接池以查找由前一个调用创建的匹配的空闲连接

也就是说,您只需要使用 sock:setkeepalive() 而不是 sock:close() 用于持久连接。Redis 对象接口有一个相应的方法:red:set_keepalive()

仍然需要在每个请求的基础上创建 redis 对象,但这将有助于避免连接开销。

2021-05-09 07:40:46