Golang 操作 Redis:连接设置与参数详解 - go-redis 使用指南

295 阅读7分钟

文章目录 **

在上一篇 《Golang 操作 Redis:快速上手 - go-redis 使用指南》 文章中,我们介绍了如何初始化 go-redis 客户端并进行了基本的 Redis 操作。本文将深入探讨 go-redis 的连接设置与参数配置,帮助你在实际项目中更好地使用 go-redis。

👉 点击查看 go-redis 使用指南目录

在《go-redis 使用指南》系列文章中,我们将详细介绍如何在 Golang 项目中使用 redis/go-redis 库与 Redis 进行交互。以下是该系列文章的全部内容:

  1. Golang 操作 Redis:快速上手 - go-redis 使用指南
  2. Golang 操作 Redis:连接设置与参数详解 - go-redis 使用指南
  3. Golang 操作 Redis:基础的字符串键值操作 - go-redis 使用指南
  4. Golang 操作 Redis:如何设置 key 的过期时间 - go-redis 使用指南
  5. Golang 操作 Redis:Hash 哈希数据类型操作用法 - go-redis 使用指南
  6. Golang 操作 Redis:Set 集合数据类型操作用法 - go-redis 使用指南
  7. Golang 操作 Redis:为 Hash 中的字段设置过期时间 - go-redis 使用指南
  8. Golang 操作 Redis:List 列表数据类型操作用法 - go-redis 使用指南
  9. Golang 操作 Redis:SortedSet 有序集合数据类型操作用法 - go-redis 使用指南
  10. Golang 操作 Redis:bitmap 数据类型操作用法 - go-redis 使用指南
  11. Golang 操作 Redis:事务处理操作用法 - go-redis 使用指南
  12. Golang 操作 Redis:地理空间数据类型操作用法 - go-redis 使用指南
  13. Golang 操作 Redis:HyperLogLog 操作用法 - go-redis 使用指南
  14. Golang 操作 Redis:Pipeline 操作用法 - go-redis 使用指南
  15. Golang 操作 Redis:PubSub发布订阅用法 - go-redis 使用指南
  16. Golang 操作 Redis:布隆过滤器(Bloom Filter)操作用法 - go-redis 使用指南
  17. Golang 操作 Redis:Cuckoo Filter操作用法 - go-redis 使用指南
  18. Golang 操作 Redis:Stream操作用法 - go-redis 使用指南

golang redis 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 实现更加精细的超时控制和重试策略,避免连接失败导致的业务中断。跨云或跨地域连接时可以设置较长的超时时间

示例:自定义连接超时、重试次数和回退时间。

阅读全文:blog.axiaoxin.com/post/go-red…