Help us shape the future of Go! Take the 2026 Go Developer Survey

redisx

package
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 3, 2026 License: Apache-2.0 Imports: 11 Imported by: 0

Documentation

Overview

Package redisx 管理单机 Redis 客户端的创建、验活、关闭和可配置的命令结果日志。 配置文件由应用解析;一个实例对应一个逻辑 Redis 目标。

以下两个示例需导入 errors、time、github.com/redis/go-redis/v9、 github.com/bpcoder16/pixiu/infra/redisx、github.com/bpcoder16/pixiu/lifecycle 和 github.com/bpcoder16/pixiu/logit;logger 由应用提供。 独立客户端使用 New 创建,每个客户端都单独登记 Close:

var stack lifecycle.Stack
if err := stack.Register(func() error {
    return logit.Close(logger)
}); err != nil {
    return err
}
client, err := redisx.New(redisx.Config{
    Name: "cache",
    Options: redis.Options{
        Addr:         "127.0.0.1:6379",
        MaxRetries:   -1,
        DialTimeout:  time.Second,
        ReadTimeout:  time.Second,
        WriteTimeout: time.Second,
    },
})
if err != nil {
    return errors.Join(err, stack.Close())
}
if err := stack.Register(client.Close); err != nil {
    return errors.Join(err, client.Close(), stack.Close())
}
// 业务处理期间使用 client.Client();停止任务和订阅后统一关闭。
return stack.Close()

命名客户端使用 NewNamed 按 Config.Name 创建并登记,所有命名客户端只登记 一次 CloseAll。下例 cfg 和 sessionCfg 是应用已构造的两个 Config:

var stack lifecycle.Stack
if err := stack.Register(func() error {
    return logit.Close(logger)
}); err != nil {
    return err
}
if err := stack.Register(redisx.CloseAll); err != nil {
    return errors.Join(err, stack.Close())
}
_, err := redisx.NewNamed(cfg)
if err != nil {
    return errors.Join(err, stack.Close())
}
if _, err := redisx.NewNamed(sessionCfg); err != nil {
    return errors.Join(err, stack.Close())
}
client := redisx.Named(cfg.Name)
_ = client
// 业务处理期间使用 client.Client() 执行命令。
// 应用退出阶段,停止业务和订阅后:
return stack.Close()

Named 对不存在的名称或已开始关闭的注册表会 panic。启动阶段由调用方串行创建 命名客户端和默认客户端,不并发初始化。所有创建返回后才 按名称查询;停止使用客户端的任务和订阅后再调用 CloseAll。 NewNamed 不与 CloseAll 并发调用,运行期不再新增命名客户端。 独立 New 创建的客户端仍由调用方单独关闭。 应用先登记日志关闭函数,再登记 Redis 关闭函数,确保日志最后关闭。 命名客户端不应单独关闭或重复登记关闭函数。

New、NewNamed 和 NewDefault 不接收外部 ctx,初始化 Ping 使用内部 context.Background();超时和重试由 Config.Options 控制,不额外设置总 deadline。 初始化失败时清理连接并返回错误。客户端生命周期由 Close 或 CloseAll 显式管理。 真实 Redis 命令继续使用调用方 ctx;未禁用驱动读写 deadline 时,命令读写会参考 ctx 的截止时间。主动 cancel 不保证打断进行中的 socket I/O,取消后仍可能返回成功。 业务命令需要限制等待时间时,应使用带 deadline 的 context 并保留合理的读写超时; 取消业务 ctx 不关闭客户端,其他选项沿用 go-redis 语义。 Network 是传输方式,Addr 是连接地址。普通 TCP 连接只需设置 host:port 形式的 Addr,Network 留空时驱动默认使用 tcp;从 Host、Port 组装时建议用 net.JoinHostPort 兼容 IPv6。Unix socket 连接应设置 Network: "unix" 和路径 Addr;TLS 连接仍使用 TCP 地址,并设置 TLSConfig,不应将 Network 设为 "tls"。redisx 要求 Addr 非空。 SlowThreshold 为 0 时默认 200 毫秒,负数无效。 MaxRetries 为 0 时驱动默认重试 3 次,为 -1 时禁用重试;非幂等操作应显式选择。 默认只记录失败与慢调用;LogCommands 开启后正常命令也以 Info 输出。 未配置 logit 时,命令结果日志为空操作;go-redis 自有诊断沿用驱动配置, 仍可能写入 stderr,与 logit 初始化状态无关。 所有已输出的业务命令日志均附加完整请求参数,可能包含 key、值和凭据。 日志保留 error_type 分类,并以 error_code 输出白名单内的 Redis 错误码, 其他情况为空字符串;不包含命令返回值或原始错误文本。底层客户端供业务使用全部命令、 Pipeline、Lua 和 Pub/Sub;调用方不能自行关闭它或在运行期修改配置与 Hook。 ctx 已调用 logit.WithStart 时,每次业务命令或批量执行会以 Redis_<Name> 为前缀自动编号记录下游耗时, 供业务调用 logit.InfoDuration 汇总;此登记不受 LogCommands 和日志级别限制。 未调用 WithStart 时跳过;初始化 Ping 和连接握手命令不计入。 CLIENT 仅过滤 SETNAME、SETINFO、MAINT_NOTIFICATIONS 握手子命令(不区分大小写); LIST、UNBLOCK 等其他子命令正常参与单命令及批量日志和耗时登记。

单个逻辑下游可显式初始化默认客户端,省去每次按名称查询。cfg 和业务 ctx 由应用提供:

if _, err := redisx.NewDefault(cfg); err != nil {
    return err
}
return redisx.Default().Client().Ping(ctx).Err()

启动阶段由调用方串行调用 NewNamed 和 NewDefault,不并发初始化。 Name 仍必填;Default() 与 Named(cfg.Name) 返回同一实例,New 和 NewNamed 不自动设置默认实例。重复默认初始化报错;失败可重试。未初始化或 CloseAll 开始后调用 Default 会 panic。应用停止任务和订阅后调用 CloseAll,默认与命名实例 统一关闭一次,日志最后关闭;默认实例不要单独登记 Close。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func CloseAll

func CloseAll() error

CloseAll 关闭全部已登记的命名及默认客户端,每个实例只关闭一次。 重复调用返回同一次关闭结果。 应用应先停止使用客户端的任务和订阅,再调用 CloseAll。

Types

type Client

type Client struct {
	// contains filtered or unexported fields
}

Client 持有一个可并发使用的 Redis 客户端。

func Default

func Default() *Client

Default 返回显式初始化的默认客户端,与 Named(cfg.Name) 是同一实例。 未初始化或 CloseAll 开始后调用会 panic;New 和 NewNamed 不设置默认实例。

func Named

func Named(name string) *Client

Named 返回已登记的命名客户端;名称不存在或关闭开始后调用会 panic。

func New

func New(cfg Config) (*Client, error)

New 创建客户端并验活;初始化超时和重试由 Config.Options 控制。 客户端由调用方显式 Close,初始化失败时自动关闭已创建的客户端。

func NewDefault

func NewDefault(cfg Config) (*Client, error)

NewDefault 创建默认客户端,同时按 Config.Name 登记;已有默认实例时返回错误。 Name 仍必填;创建失败可重试,初始化与关闭约束与 NewNamed 相同。

func NewNamed

func NewNamed(cfg Config) (*Client, error)

NewNamed 创建并按 Config.Name 登记客户端。名称重复时不替换已有实例。 启动阶段由调用方串行创建;初始化完成后可并发查询。 初始化完成后不得再调用,所有创建返回后才开始查询,关闭须在初始化之后执行。

func (*Client) Client

func (c *Client) Client() *redis.Client

Client 返回底层客户端;调用方不能自行关闭它或在运行期修改配置与 Hook。

func (*Client) Close

func (c *Client) Close() error

Close 关闭连接池;重复调用返回首次关闭结果。

type Config

type Config struct {
	Name    string
	Options redis.Options
	// SlowThreshold 是慢命令阈值;零值默认 200 毫秒,负数无效。
	SlowThreshold time.Duration
	// LogCommands 控制是否记录正常命令的 Info 日志;所有已输出的业务命令日志
	// 均附加完整请求参数,可能包含 key、值和凭据。
	LogCommands bool
}

Config 配置一个单机 Redis 目标及其命令日志。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL