lua-resty-redis-connector

用于 lua-resty-redis 的连接工具,使其能够轻松可靠地连接到 Redis 主机,无论是直接连接还是通过 Redis Sentinel 连接。

$ opm get pintsized/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://[email protected]: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,分别表示主服务器/从服务器。

在 5.0.1 以上版本的 Redis 中,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)

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

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 <[email protected]>

许可证

此模块在 2 条款 BSD 许可证下获得许可。

版权所有 (c) James Hurst <[email protected]>

保留所有权利。

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

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

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

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

作者

James Hurst

许可证

2bsd

版本