如何为数据库编写连接。 令人敬畏的包Redis为缓存redis数据库连接提供了类型池。
如何编写这种缓存数据库连接的连接池?
答案 0 :(得分:1)
这些是redis.Pool
的导出字段:
type Pool struct {
Dial func() (Conn, error)
TestOnBorrow func(c Conn, t time.Time) error
MaxIdle int
MaxActive int
IdleTimeout time.Duration
}
Dial
需要按需创建新连接。也就是说,当池已经将其所有连接都撤出并且从它请求新的连接时。TestOnBorrow
会在连接到用户之前检查连接的运行状况。如果它返回错误,将创建一个新连接(使用Dial
),旧连接将被关闭/丢弃。MaxIdle
是池中包含的未归属连接数。如果池有这么多连接,则池不会创建任何新连接(通过Dial
)。MaxActive
是池在任何给定时间管理的总连接数。 Lended加上没有联系。IdleTimeout
是一个持续时间,在该持续时间之后,已经在游泳池中未连接的连接将被关闭,而新的连接将在其中打开。我使用“借贷”这个词而不是“借用”,因为数据流动的方向(谁提供和谁在消费)更清晰。
要实现这样的池,您还需要包装您的连接(就像redis包那样),以便在用户对它们调用Close()
时将它们返回到池中。此外,每个连接都保留一个读/写时间戳,以提供空闲超时功能。
为了同时使用,您还需要提供连接的访问锁定和原子计数,以便永远不会超过最大空闲/活动连接数。
redis连接池管理的实际连接集保存在list.List
的{{1}}字段的Pool
结构中。