redigo代码分析-pool

redis连接池获取一个连接,在获取连接之前,先把超时的空闲连接断开

// get prunes stale connections and returns a connection from the idle list or

// creates a new connection.
func (p *Pool) get() (Conn, error) {
    p.mu.Lock()


    // Prune stale connections.


    if timeout := p.IdleTimeout; timeout > 0 { 
        for i, n := 0, p.idle.Len(); i < n; i++ {
            e := p.idle.Back()
            if e == nil {
                break
            }   
            ic := e.Value.(idleConn)
            if ic.t.Add(timeout).After(nowFunc()) {
                break
            }   
            p.idle.Remove(e)
            p.release()
            p.mu.Unlock()
            ic.c.Close()
            p.mu.Lock()
        }   

    }

   ......

}

对空闲list遍历,如果该连接在失效时间(timeout)内,则认为是可用连接,否则当做失效连接,删除。找到第一个可用连接即可返回。

注意: 这里是从后向前遍历,找到第一个可用的就退出。在下面的循环中(没有列出,省略了),是从前面获取一个,这也是返回最近使用过的连接。因为在put的时候,是放在list的前面的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值