回顾
上一篇博客我们构建了一个简单的同步执行的能发送命令到redis服务器的例子,这次我们尝试构建一个连接池,可以让GO并发执行redis命令
最终的目录结构
其中 redis.go是供外部调用的主文件,options.go是可配置的相关参数,internal/pool下是跟连接池相关的
最终想要实现成的结果
package main
import (
"github.com/learn-go/redis"
)
func main() {
client := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
})
client.SendCommand("SET hello world")
}
实现流程图
1. NewClient过程
2.SendCommand过程
具体实现代码
redis.go
package redis
import(
"github.com/learn-go/redis/internal/pool"
)
type Client struct {
opt *Options
connPool pool.Pooler
}
//发送命令
func (c *Client) SendCommand(cmd string) error {
cn, err := c.getConn()
if err != nil {
return err
}
cn.WithWrite(cmd)
c.releaseConn(cn)
return err
}
//释放连接
func (c *Client) releaseConn(cn *pool.Conn){
c.connPool.Put(cn)
}
//获取一个可用连接
func (c *Client) getConn() (*pool.Conn, error) {
cn, err := c.connPool.Get()
if err != nil {
return nil, err
}
return cn, nil
}
//生成一个redis客户端
func NewClient(opt *Options) *Client {
opt.init()
c := Client{
opt: opt,
connPool: newConnPool(opt),
}
return &c
}
options.go
package redis
import(
"time"
"runtime"
"net"
"github.com/learn-go/redis/internal/pool"
)
type Options struct {
// The network type, either tcp or unix.
// Default is tcp.
//network类型,
Network string
// 服务器地址 格式是host:port localhost:6379
Addr string
//连接函数
Dialer func() (net.Conn, error)
// Dial timeout for establishing new connections.
// Default is 5 se