lua-resty-redis-connector

用于 lua-resty-redis 的连接实用程序,使连接到 Redis 主机变得简单可靠,无论是直接连接还是通过 Redis Sentinel 连接。

$ opm get ledgetech/lua-resty-redis-connector

lua-resty-redis-connector

[!构建状态](https://travis-ci.org/ledgetech/lua-resty-redis-connector)

用于 lua-resty-redis 的连接实用程序,使连接到 Redis 主机变得简单可靠,无论是直接连接还是通过 Redis Sentinel 连接。

概要

在本地主机上对数据库 2 进行快速简单的身份验证连接

    local redis, err = require("resty.redis.connector").new({
        url = "redis://PASSWORD@127.0.0.1:6379/2",
    }):connect()

更详细的配置,包含超时和默认密码

    local rc = require("resty.redis.connector").new({
        connect_timeout = 50,
        read_timeout = 5000,
        keepalive_timeout = 30000,
        password = "mypass",
    })
    
    local redis, err = rc:connect({
        url = "redis://127.0.0.1:6379/2",
    })
    
    -- ...
    
    local ok, err = rc:set_keepalive(redis)  -- uses keepalive params

将所有配置保存在一个表中,以便根据需要轻松创建/关闭连接。

    local rc = require("resty.redis.connector").new({
        connect_timeout = 50,
        read_timeout = 5000,
        keepalive_timeout = 30000,
    
        host = "127.0.0.1",
        port = 6379,
        db = 2,
        password = "mypass",
    })
    
    local redis, err = rc:connect()
    
    -- ...
    
    local ok, err = rc:set_keepalive(redis)

connect 可用于覆盖 new 中给出的一些默认值,这些默认值仅与此连接相关。

    local rc = require("resty.redis.connector").new({
        host = "127.0.0.1",
        port = 6379,
        db = 2,
    })
    
    local redis, err = rc:connect({
        db = 5,
    })

DSN 格式

如果存在 params.url 字段,则会对其进行解析以设置其他参数。任何手动指定的参数都将覆盖 DSN 中给出的值。

注意:这是从 v0.06 开始的行为更改。之前,DSN 值将优先。

直接 Redis 连接

直接连接到 Redis 的格式为

redis://PASSWORD@HOST:PORT/DB

PASSWORDDB 字段是可选的,所有其他组件都是必需的。

通过 Redis Sentinel 连接

通过 Redis Sentinel 连接时的格式如下

sentinel://PASSWORD@MASTER_NAME:ROLE/DB

同样,PASSWORDDB 是可选的。ROLE 必须是 ms,分别表示主服务器/从服务器。

在 Redis 5.0.1 以上版本中,Sentinel 可选择要求其自己的密码。如果已启用,请在 sentinel_password 参数中提供此密码。

还必须提供一个 sentinels 表格。例如:

    local redis, err = rc:connect{
        url = "sentinel://mymaster:a/2",
        sentinels = {
            { host = "127.0.0.1", port = 26379 },
        },
        sentinel_password = "password"
    }

代理模式

如果通过代理服务(例如 Twemproxy)连接到 Redis,请启用 connection_is_proxied 参数。这些代理通常仅支持 Redis 命令的有限子集,这些命令不需要状态并且不会影响多个键。数据库和事务也不受支持。

代理模式将禁用在连接时切换到数据库。不受支持的命令(默认为 Twemproxy 不支持的命令)将立即返回 nil, err,而不是发送到代理,这可能导致连接断开。

添加连接到 keepalive 池时,不会发送 discard

禁用的命令

如果配置为命令表,则命令方法将被一个函数替换,该函数会立即返回 nil, err,而不会将命令转发到服务器。

默认参数

    {
        connect_timeout = 100,
        read_timeout = 1000,
        connection_options = {}, -- pool, etc
        keepalive_timeout = 60000,
        keepalive_poolsize = 30,
    
        host = "127.0.0.1",
        port = "6379",
        path = "",  -- unix socket path, e.g. /tmp/redis.sock
        password = "",
        sentinel_password = "",
        db = 0,
    
        master_name = "mymaster",
        role = "master",  -- master | slave
        sentinels = {},
    
        connection_is_proxied = false,
    
        disabled_commands = {},
    }

API

new

语法:rc = redis_connector.new(params)

创建 Redis Connector 对象,用给定的参数覆盖默认参数。如果发生错误,则返回 nil 和描述错误的字符串。

connect

语法:redis, err = rc:connect(params)

尝试根据提供的 params 创建连接,回退到 new 中给出的默认值或预定义的默认值。如果无法建立连接,则返回 nil 和描述原因的字符串。

请注意,此处给出的 params 不会更改连接器自身的配置,仅用于更改此特定连接操作。因此,以下参数在 connect 中给出时没有意义。

  • keepalive_poolsize

  • keepalive_timeout

  • connection_is_proxied

  • disabled_commands

set_keepalive

语法:ok, err = rc:set_keepalive(redis)

尝试根据 new 中给出的超时和池大小参数或预定义的默认值,将给定的 Redis 连接置于 keepalive 池中。

这允许应用程序释放资源,而无需跟踪应用程序范围的 keepalive 设置。

返回 1,或者在发生错误的情况下返回 nil 和描述错误的字符串。

实用程序

以下方法通常不需要,但如果需要自定义接口,则可能有用。

connect_via_sentinel

语法:redis, err = rc:connect_via_sentinel(params)

首先访问 params.sentinels 表格提供的 Sentinel,并使用 params.master_nameparams.role 查询它,从而返回一个 Redis 连接。

try_hosts

语法:redis, err = rc:try_hosts(hosts)

按顺序尝试提供的 host,并返回第一个成功的连接。

connect_to_host

语法:redis, err = rc:connect_to_host(host)

尝试连接到提供的 host

sentinel.get_master

语法:master, err = sentinel.get_master(sentinel, master_name)

给定一个已连接的 Sentinel 实例和一个主服务器名称,将返回当前的主 Redis 实例。

sentinel.get_slaves

语法:slaves, err = sentinel.get_slaves(sentinel, master_name)

给定一个已连接的 Sentinel 实例和一个主服务器名称,将返回已注册的从 Redis 实例列表。

作者

James Hurst <james@pintsized.co.uk>

许可证

此模块根据 2 条款 BSD 许可证许可。

版权所有 (c) James Hurst <james@pintsized.co.uk>

保留所有权利。

在满足以下条件的情况下,允许以源代码和二进制形式重新分发和使用,无论是否修改:

  • 源代码的重新分发必须保留上述版权声明、此条件列表和以下免责声明。

  • 二进制形式的重新分发必须在随分发提供的文档和/或其他材料中复制上述版权声明、此条件列表和以下免责声明。

本软件由版权持有人和贡献者“按原样”提供,并且不提供任何明示或暗示的保证,包括但不限于适销性和特定用途适用性的暗示保证。在任何情况下,版权持有人或贡献者均不对任何直接、间接、偶然、特殊、惩罚性或后果性损害(包括但不限于替代商品或服务的采购;使用、数据或利润损失;或业务中断)负责,无论此类损害是如何造成的以及基于任何责任理论,无论是合同、严格责任或侵权行为(包括疏忽或其他原因),即使已被告知可能发生此类损害。

作者

James Hurst

许可证

2bsd

版本