环境介绍:
这篇文章回顾Go如何编写Redis连接池基本步骤,顺便解读redigo关于连接池必要的源码。
第一步,声明一个连接池指针,作用域为全局。连接池必须在程序使用前初始化好。此时只需要使用init()函数来注册连接池,连接池是一个结构体类型,使用相应的语法初始化连接池的三个属性:MaxIdle(池中空闲连接的最大数目)、MaxActive(在给定时间由池分配的最大连接数)、IdleTimeout(关闭连接的最大空闲时间)并用Dial函数创建和配置连接。
第二步,使用连接池对象调用Get方法来从连接池获取连接,延迟关闭连接。
第三步,给Redis写入数据,这里使用String类型的SET命令。然后使用GET命令获取数据。
⚠️:要从连接池读取连接必须要保持连接池存活,不过在关闭连接池后还是能够读取连接但是无法操作,在解读源码部分会详细介绍。
基于前面的两篇文章对Go如何操作Redis的String、Hash类型的详细讲解,其实操作连接池也是非常简单的,主要是应用init函数来注册连接池即可。
redigo源码解读:
MaxIdle,顾名思义就是限制最大的空闲数,根据项目的实际需求调整,合理设置,过大浪费资源,过小则无法发挥出连接池的优势(相对)。MaxActive,在给定的时间由池分配的最大连接数,为零时,池中的连接数没有限制。IdleTimeout,设置最大空闲时间,在超过这段时间后关闭连接,如果设置为零,则连接一直活跃,程序在设置超时值时必须小于服务器超时的值。
TestOnBorrow,这个是可选函数,用于检查空闲连接的健康情况。Wait,当设置为true时,如果连接池的连接数已经达到最大的活跃数,那么Get方法会被阻塞到有连接返回到连接池(空闲)才会继续执行。MaxConnLifetime,设置连接到声明周期,如果设置为零,则连接池不会根据连接到年龄来关闭连接。
Dial 函数,用于创建和配置连接,注意,Dial返回的连接不能处于特殊状态,比如事务的开始。
Get 方法,从连接池获取连接,程序使用完连接后必须将其关闭。注意,这个方法始终返回有效连接,以便应用程序可以将错误处理推迟到第一次使用连接。这就是前面提到的「连接池被关闭后,还能读到连接,但却无法操作」的原因。如果获取底层连接出现错误,则连接Err、Do、Send、Flush和Receive方法返回该错误。
取消conn2.Close的注释来测试,确实如此,在连接池关闭后,能够获取底层连接的信息,但是却无法继续操作这条连接。
【GitHub源码地址】: