文章目录 **
在上一篇 《Golang 操作 Redis:快速上手 - go-redis 使用指南》 文章中,我们介绍了如何初始化 go-redis 客户端并进行了基本的 Redis 操作。本文将深入探讨 go-redis 的连接设置与参数配置,帮助你在实际项目中更好地使用 go-redis。
👉 点击查看 go-redis 使用指南目录
在《go-redis 使用指南》系列文章中,我们将详细介绍如何在 Golang 项目中使用 redis/go-redis 库与 Redis 进行交互。以下是该系列文章的全部内容:
- Golang 操作 Redis:快速上手 - go-redis 使用指南
- Golang 操作 Redis:连接设置与参数详解 - go-redis 使用指南
- Golang 操作 Redis:基础的字符串键值操作 - go-redis 使用指南
- Golang 操作 Redis:如何设置 key 的过期时间 - go-redis 使用指南
- Golang 操作 Redis:Hash 哈希数据类型操作用法 - go-redis 使用指南
- Golang 操作 Redis:Set 集合数据类型操作用法 - go-redis 使用指南
- Golang 操作 Redis:为 Hash 中的字段设置过期时间 - go-redis 使用指南
- Golang 操作 Redis:List 列表数据类型操作用法 - go-redis 使用指南
- Golang 操作 Redis:SortedSet 有序集合数据类型操作用法 - go-redis 使用指南
- Golang 操作 Redis:bitmap 数据类型操作用法 - go-redis 使用指南
- Golang 操作 Redis:事务处理操作用法 - go-redis 使用指南
- Golang 操作 Redis:地理空间数据类型操作用法 - go-redis 使用指南
- Golang 操作 Redis:HyperLogLog 操作用法 - go-redis 使用指南
- Golang 操作 Redis:Pipeline 操作用法 - go-redis 使用指南
- Golang 操作 Redis:PubSub发布订阅用法 - go-redis 使用指南
- Golang 操作 Redis:布隆过滤器(Bloom Filter)操作用法 - go-redis 使用指南
- Golang 操作 Redis:Cuckoo Filter操作用法 - go-redis 使用指南
- Golang 操作 Redis:Stream操作用法 - go-redis 使用指南
初始化 go-redis 客户端
在使用 go-redis 前,需要初始化一个 Redis 客户端。除了基础的地址和数据库编号,go-redis 提供了许多配置参数来优化连接。以下是一个详细的初始化示例:
package main
import (
"context"
"crypto/tls"
"fmt"
"net"
"time"
"github.com/redis/go-redis/v9"
)
func main() {
// 创建一个新的 Redis 客户端配置
options := &redis.Options{
// 网络类型,使用 tcp 连接
Network: "tcp",
// Redis 服务器地址
Addr: "localhost:6379",
// 客户端名称
ClientName: "myRedisClient",
// 自定义 Dialer 函数
Dialer: func(ctx context.Context, network, addr string) (net.Conn, error) {
// 这里可以自定义连接逻辑
return net.Dial(network, addr)
},
// 新连接建立时调用的钩子函数
OnConnect: func(ctx context.Context, cn *redis.Conn) error {
fmt.Println("新连接建立")
return nil
},
// 使用的协议版本,默认是 3
Protocol: 3,
// Redis 6.0 及以上版本的用户名
Username: "",
// Redis 密码
Password: "",
// 凭据提供者
CredentialsProvider: func() (string, string) {
return "", ""
},
// 数据库选择
DB: 0,
// 最大重试次数
MaxRetries: 3,
// 最小重试回退时间
MinRetryBackoff: 8 * time.Millisecond,
// 最大重试回退时间
MaxRetryBackoff: 512 * time.Millisecond,
// 连接超时
DialTimeout: 5 * time.Second,
// 读取超时
ReadTimeout: 3 * time.Second,
// 写入超时
WriteTimeout: 3 * time.Second,
// 是否启用上下文超时
ContextTimeoutEnabled: true,
// 连接池类型,FIFO
PoolFIFO: true,
// 基础连接数
PoolSize: 10,
// 连接池超时时间
PoolTimeout: 1 * time.Second,
// 最小空闲连接数
MinIdleConns: 2,
// 最大空闲连接数
MaxIdleConns: 5,
// 最大活跃连接数
MaxActiveConns: 20,
// 最大连接闲置时间
ConnMaxIdleTime: 30 * time.Minute,
// 最大连接生命周期
ConnMaxLifetime: 1 * time.Hour,
// TLS 配置
TLSConfig: &tls.Config{
InsecureSkipVerify: true, // 允许不验证 TLS 证书
},
// 限制器接口
Limiter: nil, // 可自定义实现限流逻辑
// 连接时禁用 set-lib 禁止设置客户端名称
DisableIndentity: false,
// 为客户端名称添加后缀
IdentitySuffix: "-suffix",
}
// 创建 Redis 客户端
rdb := redis.NewClient(options)
// 使用上下文
ctx := context.Background()
// 测试连接
pong, err := rdb.Ping(ctx).Result()
if err != nil {
fmt.Println("连接 Redis 失败:", err)
return
}
fmt.Println("连接 Redis 成功:", pong) // 预期输出: 连接 Redis 成功: PONG
// 关闭客户端
defer rdb.Close()
}
go-redis 客户端连接设置详解
在 go-redis 中,连接设置是通过 Options 结构体来管理的。Options 结构体中包含的所有参数及其功能描述整理如下:
- Network - 网络类型,可以是 tcp 或 unix,默认值为 tcp。
- Addr - Redis 服务器的 host:port 地址。
- ClientName - 为每个连接执行
CLIENT SETNAME ClientName命令。 - Dialer - 创建新网络连接的函数,优先于 Network 和 Addr 选项。
- OnConnect - 新连接建立时调用的钩子函数。
- Protocol - 使用的协议版本,支持 2 或 3,默认是 3。
- Username - 连接 Redis 6.0 及更高版本时使用的用户名,用于身份验证。
- Password - 连接 Redis 时使用的可选密码。
- CredentialsProvider - 允许在重新连接之前更新用户名和密码。
- CredentialsProviderContext - CredentialsProvider 的增强版本,未来可能会合并。
- DB - 连接后选择的数据库编号。
- MaxRetries - 在放弃之前的最大重试次数,默认是 3。
- MinRetryBackoff - 每次重试之间的最小等待时间,默认是 8 毫秒。
- MaxRetryBackoff - 每次重试之间的最大等待时间,默认是 512 毫秒。
- DialTimeout - 建立新连接的超时时间,默认是 5 秒。
- ReadTimeout - 套接字读取的超时时间,默认是 3 秒。
- WriteTimeout - 套接字写入的超时时间,默认是 3 秒。
- ContextTimeoutEnabled - 控制客户端是否尊重上下文的超时和截止时间。
- PoolFIFO - 连接池类型,true 表示 FIFO,false 表示 LIFO。
- PoolSize - 每个可用 CPU 的基础连接数,默认是 10。
- PoolTimeout - 如果所有连接都忙碌,客户端等待连接的时间,默认是 ReadTimeout + 1 秒。
- MinIdleConns - 最小空闲连接数,默认是 0。
- MaxIdleConns - 最大空闲连接数,默认是 0。
- MaxActiveConns - 连接池中同时分配的最大连接数,默认无限制。
- ConnMaxIdleTime - 连接可能闲置的最大时间,默认是 30 分钟。
- ConnMaxLifetime - 连接可重用的最大时间,默认是不关闭闲置连接。
- TLSConfig - 使用的 TLS 配置。
- Limiter - 用于实现断路器或速率限制的接口。
- DisableIndentity - 连接时禁用 set-lib,默认值为 false。
- IdentitySuffix - 客户端名称的后缀,默认值为空。
go-redis 客户端高级连接配置
在某些场景下,或者遇到某些特定的业务逻辑,我们可能需要使用到 go-redis 更加高级的连接配置。下面简单举几个例子。
go-redis 自定义 Dialer 函数
自定义 Dialer 函数适用于需要更加灵活和高级连接配置的场景,比如代理连接、超时控制、安全认证、负载均衡、调试诊断、以及跨地域网络优化等。以下是一些常见的业务使用场景:
1. 定制连接超时与重试逻辑
对于高并发业务,可能会遇到 Redis 连接建立缓慢或频繁重试的问题,特别是在跨数据中心的分布式架构下。可以通过自定义 Dialer 实现更加精细的超时控制和重试策略,避免连接失败导致的业务中断。跨云或跨地域连接时可以设置较长的超时时间
示例:自定义连接超时、重试次数和回退时间。