为了账号安全,请及时绑定邮箱和手机立即绑定

写连接池。

写连接池。

Go
慕的地10843 2021-08-23 17:07:09
例如,我如何为数据库编写连接。很棒的Redis包为缓存 redis 数据库连接提供了类型池。如何编写这种缓存数据库连接的连接池?
查看完整描述

1 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

这些是导出的字段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是池在任何给定时间将管理的总连接数。借出加上非借出的连接。

  • IdleTimeout 是一个持续时间,在此之后,一直处于未借出的池中的连接将被关闭,并取而代之打开一个新的连接。

我使用“借贷”一词而不是“借用”一词,因为数据流动的方向(谁提供和谁消费)更加清晰。

要实现这样的池,您还需要包装您的连接(如 redis 包所做的那样),以便在用户调用Close()它们时将它们返回到池中。此外,每个连接上都会保留一个读/写时间戳,以提供空闲超时功能。

为了同时可用,您还需要提供连接的访问锁定和原子计数,以便您永远不会超过最大空闲/活动连接数。

由 redis 连接池管理的实际连接集保存在's字段的list.List结构中。Poolidle


查看完整回答
反对 回复 2021-08-23
  • 1 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信