go 连接redis主要使用conn.go文件中的连接函数, 一般使用Dial, DialURL 当然也有
NewConn 创建于redis的连接, 在应用程序使用完毕后必须调用连接的Close() 方法将连接关闭,否则,有可能出现连接池溢出的问题
dial定义
func Dial(network, address string, options ...DialOption) (Conn, error)
network网络协议, 一般指定tcp即可
address 为连接字符串 比如’127.0.0.1:6379’
默认情况下, 没有通过DailOption指定db, 则db默认为0
type DialOption struct {
f func(*dialOptions)
}
type dialOptions struct {
readTimeout time.Duration
writeTimeout time.Duration
dialer *net.Dialer
dial func(network, addr string) (net.Conn, error)
db int
password string
clientName string
useTLS bool
skipVerify bool
tlsConfig *tls.Config
}
DialOption 其实封装了dialOptions, 对应参数的修改也提供量一些对应的方法,根据参数名,可以很方便地找到, 比如,db参数设置func DialDatabase(db int) DialOption
使用DialDatabase即可设置, 具体可以参考如下
连接db时候使用
1.DialClientName
func DialClientName(name string)DialOption
指定Redis服务器连接使用的客户端名称。
2.DialConnectTimeout
func DialConnectTimeout(d time.Duration) DialOption
指定在未指定DialNetDial选项时连接到Redis服务器的超时。
3.DialDatabase
func DialDatabase(db int)DialOption
指定连接时要选择的数据库。
5.DialKeepAlive
func DialKeepAlive(d time.Duration) DialOption
指定在未指定DialNetDial选项时与Redis服务器的TCP连接的保持活动期。如果为零,则不启用keep-alives。如果未指定DialKeepAlive选项,则使用默认值5分钟来确保检测到半封闭的TCP会话。
6.DialNetDial
func DialNetDial(dial func(network, addr string) (net.Conn, error)) DialOption
指定用于创建TCP连接的自定义拨号功能,否则使用通过其他选项自定义的net.Dialer。DialNetDial会覆盖DialConnectTimeout和DialKeepAlive。
7.DialPassword
func DialPassword(password string) DialOption
连接到Redis服务器的密码。
8.DialReadTimeout
func DialReadTimeout(d time.Duration) DialOption
指定读取单个命令回复超时时间。
9.DialTLSConfig
func DialTLSConfig(c *tls.Config) DialOption
指定在TLS连接时使用的配置。
10.DialTLSSkipVerify
func DialTLSSkipVerify(skip bool)DialOption
通过TLS连接时,DialTLSSkipVerify禁用服务器名称验证。
11.DialUseTLS
func DialUseTLS(useTLS bool)DialOption
是否应使用TLS。DialURL忽略此选项。
12.DialWriteTimeout
func DialWriteTimeout(d time.Duration) DialOption
写入单个命令的超时时间
设置示例:
setdb := redis.DialDatabase(12) // 设置db
setPasswd := redis.DialPassword("") // 设置redis连接密码
示例代码:
并验证默认db为0; 这里建立两个连接, 分别操作两个不同的db,验证db参数设置成功
func main() {
setdb := redis.DialDatabase(12)
setPasswd := redis.DialPassword("")
c1, err := redis.Dial("tcp", "127.0.0.1:6379", setdb, setPasswd)
if err != nil {
log.Fatalln(err)
}
defer c1.Close()
c2, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
log.Fatalln(err)
}
defer c2.Close()
resset, err := redis.String(c1.Do("SET", "my_test", "redigo"))
if err != nil {
fmt.Println("set err")
} else {
fmt.Println(resset)
}
//获取value并转成字符串
account_balance, err := redis.String(c1.Do("GET", "my_test"))
if err != nil {
fmt.Println("err while getting:", err)
} else {
fmt.Println(account_balance)
}
c2_get, err := redis.String(c2.Do("GET", "my_test"))
if err != nil {
fmt.Println("err while getting:", err)
} else {
fmt.Println(c2_get)
}
}
输出:
OK
redigo
err while getting: redigo: nil returned
DialURL使用Redis URI方案连接到给定URL的Redis服务器
例如:
c, err := redis.DialURL("redis://127.0.0.1:6379"")
if err != nil {
// handle connection error
}
defer c.Close()
并发性:
connection不支持并发操作,但支持一个connection调用send, flush, 另一个recive, 如果要使用并发,建议使用redis pool连接池进行, 从goroutine获取