Go Redis 配置
限流器
// Limiter 是限流或禁止请求的一个接口,需要用户自己实现
type Limiter interface {
// Allow 方法返回一个error类型
// 1、如果不允许则返回一个错误,go-redis会把这个错误传递到调用命令处的error,
// 例如 rdb.Get(...).Err() 将收到 Allow() 返回的错误
// 2、如果允许操作,返回nil,go-redis则通过 ReportResult(err) 报告此次操作的结果
Allow() error
// 如果 Allow() 允许此次操作,则会通过 ReportResult(err) 方法报告此次操作的结果
// err为nil或具体错误
ReportResult(result error)
}
Redis Client
type Options struct {
// 连接网络类型,如: tcp、udp、unix等方式
// 如果为空默认tcp
Network string
// redis服务器地址,ip:port格式,比如:192.168.1.100:6379
// 默认为 :6379
Addr string
// ClientName 是对网络连接设置一个名字,使用 "CLIENT LIST" 命令
// 可以查看redis服务器当前的网络连接列表
// 如果设置了ClientName,go-redis对每个连接调用 `CLIENT SETNAME ClientName` 命令
// 查看: https://redis.io/commands/client-setname/
// 默认为空,不设置客户端名称
ClientName string
// 如果你想自定义连接网络的方式,可以自定义 `Dialer` 方法,
// 如果不指定,将使用默认的方式进行网络连接 `redis.NewDialer`
Dialer func(ctx context.Context, network, addr string) (net.Conn, error)
// 建立了新连接时调用此函数
// 默认为nil
OnConnect func(ctx context.Context, cn *Conn) error
// 当redis服务器版本在6.0以上时,作为ACL认证信息配合密码一起使用,
// ACL是redis 6.0以上版本提供的认证功能,6.0以下版本仅支持密码认证。
// 默认为空,不进行认证。
Username string
// 当redis服务器版本在6.0以上时,作为ACL认证信息配合密码一起使用,
// 当redis服务器版本在6.0以下时,仅作为密码认证。
// ACL是redis 6.0以上版本提供的认证功能,6.0以下版本仅支持密码认证。
// 默认为空,不进行认证。
Password string
// 允许动态设置用户名和密码,go-redis在进行网络连接时会获取用户名和密码,
// 这对一些认证鉴权有时效性的系统来说很有用,比如一些云服务商提供认证信息有效期为12小时。
// 默认为nil
CredentialsProvider func() (username string, password string)
// redis DB 数据库,默认为0
DB int
// 命令最大重试次数, 默认为3
MaxRetries int
// 每次重试最小间隔时间
// 默认 8 * time.Millisecond (8毫秒) ,设置-1为禁用
MinRetryBackoff time.Duration
// 每次重试最大间隔时间
// 默认 512 * time.Millisecond (512毫秒) ,设置-1为禁用
MaxRetryBackoff time.Duration
// 建立新网络连接时的超时时间
// 默认5秒
DialTimeout time.Duration
// 从网络连接中读取数据超时时间,可能的值:
// 0 - 默认值,3秒
// -1 - 无超时,无限期的阻塞
// -2 - 不进行超时设置,不调用 SetReadDeadline 方法
ReadTimeout time.Duration
// 把数据写入网络连接的超时时间,可能的值:
// 0 - 默认值,3秒
// -1 - 无超时,无限期的阻塞
// -2 - 不进行超时设置,不调用 SetWriteDeadline 方法
WriteTimeout time.Duration
// 是否使用context.Context的上下文截止时间,
// 有些情况下,context.Context的超时可能带来问题。
// 默认不使用
ContextTimeoutEnabled bool
// 连接池的类型,有 LIFO 和 FIFO 两种模式,
// PoolFIFO 为 false 时使用 LIFO 模式,为 true 使用 FIFO 模式。
// 当一个连接使用完毕时会把连接归还给连接池,连接池会把连接放入队尾,
// LIFO 模式时,每次取空闲连接会从"队尾"取,就是刚放入队尾的空闲连接,
// 也就是说 LIFO 每次使用的都是热连接,连接池有机会关闭"队头"的长期空闲连接,
// 并且从概率上,刚放入的热连接健康状态会更好;
// 而 FIFO 模式则相反,每次取空闲连接会从"队头"取,相比较于 LIFO 模式,
// 会使整个连接池的连接使用更加平均,有点类似于负载均衡寻轮模式,会循环的使用
// 连接池的所有连接,如果你使用 go-redis 当做代理让后端 redis 节点负载更平均的话,
// FIFO 模式对你很有用。
// 如果你不确定使用什么模式,请保持默认 PoolFIFO = false
PoolFIFO bool
// 连接池最大连接数量,注意:这里不包括 pub/sub,pub/sub 将使用独立的网络连接
// 默认为 10 * runtime.GOMAXPROCS
PoolSize int
// PoolTimeout 代表如果连接池所有连接都在使用中,等待获取连接时间,超时将返回错误
// 默认是 1秒+ReadTimeout
PoolTimeout time.Duration
// 连接池保持的最小空闲连接数,它受到PoolSize的限制
// 默认为0,不保持
MinIdleConns int
// 连接池保持的最大空闲连接数,多余的空闲连接将被关闭
// 默认为0,不限制
MaxIdleConns int
// ConnMaxIdleTime 是最大空闲时间,超过这个时间将被关闭。
// 如果 ConnMaxIdleTime <= 0,则连接不会因为空闲而被关闭。
// 默认值是30分钟,-1禁用
ConnMaxIdleTime time.Duration
// ConnMaxLifetime 是一个连接的生存时间,
// 和 ConnMaxIdleTime 不同,ConnMaxLifetime 表示连接最大的存活时间
// 如果 ConnMaxLifetime <= 0,则连接不会有使用时间限制
// 默认值为0,代表连接没有时间限制
ConnMaxLifetime time.Duration
// 如果你的redis服务器需要TLS访问,可以在这里配置TLS证书等信息
// 如果配置了证书信息,go-redis将使用TLS发起连接,
// 如果你自定义了 `Dialer` 方法,你需要自己实现网络连接
TLSConfig *tls.Config
// 限流器的配置,参照 `Limiter` 接口
Limiter Limiter
// 设置启用在副本节点只读查询,默认为false不启用
// 参照:https://redis.io/commands/readonly
readOnly bool
}
Redis Cluster Client
部分配置项继承自 Options
,请查看 Options 说明。
type ClusterOptions struct {
// redis集群的列表地址
// 例如:[]string{"192.168.1.10:6379", "192.168.1.11:6379"}
Addrs []string
// ClientName 和 `Options` 相同,会对集群每个Node节点的每个网络连接配置
ClientName string
// New集群节点 `*redis.Client` 的对象,
// go-redis 默认使用 `redis.NewClient(opt)` 方法
NewClient func(opt *Options) *Client
// 同 `Options`
MaxRedirects int
// 启用从节点处理只读命令,go-redis会把只读命令发给从节点(如果有从节点)
// 默认不启用
ReadOnly bool
// 把只读命令发送到响应最快的节点,自动启用 `ReadOnly` 选项
RouteByLatency bool
// 把只读命令随机到一个节点,自动启用 `ReadOnly` 选项
RouteRandomly bool
// 返回redis集群Slot信息的函数,go-redis默认将获取redis-cluster的配置信息
// 如果你是自建redis集群在节点直接操作读写,需要自己配置Slot信息
// 可以使用 `Cluster.ReloadState` 手动加载集群配置信息
ClusterSlots func(context.Context) ([]ClusterSlot, error)
// 下面的配置项,和 `Options` 基本一致,请参照 `Options` 的说明
Dialer func(ctx context.Context, network, addr string) (net.Conn, error)
OnConnect func(ctx context.Context, cn *Conn) error
Username string
Password string
MaxRetries int
MinRetryBackoff time.Duration
MaxRetryBackoff time.Duration
DialTimeout time.Duration
ReadTimeout time.Duration
WriteTimeout time.Duration
ContextTimeoutEnabled bool
PoolFIFO bool
// 连接池配置项,是针对集群中的一个节点,而不是整个集群
// 例如你的集群有15个redis节点, `PoolSize` 代表和每个节点的连接数量
// 最终最大连接数为 PoolSize * 15节点数量
PoolSize int
PoolTimeout time.Duration
MinIdleConns int
MaxIdleConns int
ConnMaxIdleTime time.Duration
ConnMaxLifetime time.Duration
TLSConfig *tls.Config
}
Redis Ring Client
部分配置项继承自 Options
,请查看 Options 说明。
// RingOptions are used to configure a ring client and should be
// passed to NewRing.
type RingOptions struct {
// redis服务器地址
// 示例:"one" => "192.168.1.10:6379", "two" => "192.168.1.11:6379"
Addrs map[string]string
// New集群节点 `*redis.Client` 的对象,
// go-redis 默认使用 `redis.NewClient(opt)` 方法
NewClient func(opt *Options) *Client
// ClientName 和 `Options` 相同,会对每个Node节点的每个网络连接配置
ClientName string
// 节点健康检查的时间间隔,默认500毫秒
// 如果连续3次检查失败,认为节点宕机
HeartbeatFrequency time.Duration
// 设置自定义的一致性hash算法,ring会在多个节点之间通过hash算法分布key
// 参考: https://medium.com/@dgryski/consistent-hashing-algorithmic-tradeoffs-ef6b8e2fcae8
NewConsistentHash func(shards []string) ConsistentHash
// 下面的配置项,和 `Options` 基本一致,请参照 `Options` 的说明
Dialer func(ctx context.Context, network, addr string) (net.Conn, error)
OnConnect func(ctx context.Context, cn *Conn) error
Username string
Password string
DB int
MaxRetries int
MinRetryBackoff time.Duration
MaxRetryBackoff time.Duration
DialTimeout time.Duration
ReadTimeout time.Duration
WriteTimeout time.Duration
PoolFIFO bool
// 连接池配置项,是针对集群中的一个节点,而不是整个集群
// 例如你的集群有15个redis节点, `PoolSize` 代表和每个节点的连接数量
// 最终最大连接数为 PoolSize * 15节点数量
PoolSize int
PoolTimeout time.Duration
MinIdleConns int
MaxIdleConns int
ConnMaxIdleTime time.Duration
ConnMaxLifetime time.Duration
TLSConfig *tls.Config
Limiter Limiter
}
Redis Failover Client 和 Failover Cluster Client
部分配置项继承自 Options
,请查看 Options 说明。
sentinel 配置:
type FailoverOptions struct {
// sentinel master节点名称
MasterName string
// 哨兵节点地址列表
// 示例:[]string{"192.168.1.10:6379", "192.168.1.11:6379"}
SentinelAddrs []string
// ClientName 和 `Options` 相同,会对每个Node节点的每个网络连接配置
ClientName string
// 用于ACL认证的用户名
SentinelUsername string
// Sentinel中 `requirepass<password>` 的密码配置
// 如果同时提供了 `SentinelUsername` ,则启用ACL认证
SentinelPassword string
// 把只读命令发送到响应最快的节点,
// 仅限于 `Failover Cluster Client`
RouteByLatency bool
// 把只读命令随机到一个节点
// 仅限于 `Failover Cluster Client`
RouteRandomly bool
// 把所有命令发送到发送到只读节点
ReplicaOnly bool
// 当所有副本节点都无法连接时,尝试使用与Sentinel已断开连接的副本
UseDisconnectedReplicas bool
// 下面的配置项,和 `Options` 基本一致,请参照 `Options` 的说明
Dialer func(ctx context.Context, network, addr string) (net.Conn, error)
OnConnect func(ctx context.Context, cn *Conn) error
Username string
Password string
DB int
MaxRetries int
MinRetryBackoff time.Duration
MaxRetryBackoff time.Duration
DialTimeout time.Duration
ReadTimeout time.Duration
WriteTimeout time.Duration
ContextTimeoutEnabled bool
PoolFIFO bool
// 连接池配置项,是针对一个节点的设置,而不是所有节点
// 例如你的集群有15个redis节点, `PoolSize` 代表和每个节点的连接数量
// 最终最大连接数为 PoolSize * 15节点数量
PoolSize int
PoolTimeout time.Duration
MinIdleConns int
MaxIdleConns int
ConnMaxIdleTime time.Duration
ConnMaxLifetime time.Duration
TLSConfig *tls.Config
}
Redis Universal Client
部分配置项继承自 Options
,请查看 Options 说明。
type UniversalOptions struct {
// 单个主机或集群配置
// 例如:[]string{"192.168.1.10:6379"}
Addrs []string
// ClientName 和 `Options` 相同,会对每个Node节点的每个网络连接配置
ClientName string
// 设置 DB, 只针对 `Redis Client` 和 `Failover Client`
DB int
// 下面的配置项,和 `Options`、`Sentinel` 基本一致,请参照 `Options` 的说明
Dialer func(ctx context.Context, network, addr string) (net.Conn, error)
OnConnect func(ctx context.Context, cn *Conn) error
Username string
Password string
SentinelUsername string
SentinelPassword string
MaxRetries int
MinRetryBackoff time.Duration
MaxRetryBackoff time.Duration
DialTimeout time.Duration
ReadTimeout time.Duration
WriteTimeout time.Duration
ContextTimeoutEnabled bool
PoolFIFO bool
// 连接池配置项,是针对一个节点的设置,而不是所有节点
// 例如你的集群有15个redis节点, `PoolSize` 代表和每个节点的连接数量
// 最终最大连接数为 PoolSize * 15节点数量
PoolSize int
PoolTimeout time.Duration
MinIdleConns int
MaxIdleConns int
ConnMaxIdleTime time.Duration
ConnMaxLifetime time.Duration
TLSConfig *tls.Config
// 集群配置项
MaxRedirects int
ReadOnly bool
RouteByLatency bool
RouteRandomly bool
// 哨兵 Master Name,仅适用于 `Failover Client`
MasterName string
}