【问题标题】:How to make my redis connection Singleton in Lua?如何在 Lua 中使我的 redis 连接单例?
【发布时间】:2021-07-30 22:47:19
【问题描述】:

我正在尝试处理 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("failed to connect: ", err)
    return
end

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

有什么方法可以使这个连接静态或单例来提高我的请求处理程序性能?

【问题讨论】:

    标签: nginx redis lua


    【解决方案1】:

    It is impossible 在不同请求之间共享一个 cosocket 对象(因此,一个 redis 对象,请查看this answer 了解详细信息):

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

    但是,nginx/ngx_lua 内部使用a connection pool

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

    话虽如此,您只需要使用sock:setkeepalive() 而不是sock:close() 来实现持久连接。 redis对象接口有对应的方法:red:set_keepalive()

    您仍然需要根据每个请求创建一个 redis 对象,但这将有助于避免连接开销。

    【讨论】:

      猜你喜欢
      • 2019-11-29
      • 2018-10-26
      • 1970-01-01
      • 2015-04-06
      • 2018-09-03
      • 2017-01-16
      • 1970-01-01
      • 2015-11-06
      • 2016-09-02
      相关资源
      最近更新 更多