Redis学习(四)-golang使用redis
目录
该文章讲解redigo的使用。
talk is cheap show me the code
redigo基本使用
opt := redis.DialPassword("root")
c, err := redis.Dial("tcp", "127.0.0.1:6379", opt)
if err != nil {
fmt.Println("Connect to redis error", err)
return
}
defer c.Close()
userName, err := redis.String(c.Do("GET", "userName"))
if err != nil {
fmt.Println("redis get failed:", err)
} else {
fmt.Printf("Get mykey: %v \n", userName)
}
获取连接的时候可以提供配置文件,上面代码中指定了密码,此外还有redis.DialConnectTimeout()等。
Do方法执行命令,与客户端使用类似。
reids提供了一系列方法从返回值interface{}转换为我们需要的类型。
redigo事务
redis还支持管道
c.Send("SET", "foo", "bar")
c.Send("GET", "foo")
c.Flush()
c.Receive() // reply from SET
v, err = c.Receive() // reply from GET
命令写在连接的缓冲区中,当flush后发送到服务器,receive方法从服务器读取一行命令的结果。
其实Do方法是上面系列方法的组合,Do以send命令并flush至缓冲区,后面接收所有的结果,其中一个命令的发生错误,那么Do方法就返回该error,所有的命令正常执行完, 则返回最后一条命令的结果。 我们使用该方案实现redis的事务:
c.Send("MULTI")
c.Send("INCR", "foo")
c.Send("INCR", "bar")
r, err := c.Do("EXEC")
fmt.Println(r) // prints [1, 1]
redigo订阅、发布
redigo中pub/sub用法
psc := redis.PubSubConn{Conn: c}
psc.Subscribe("example")
for {
switch v := psc.Receive().(type) {
case redis.Message:
fmt.Printf("%s: message: %s\n", v.Channel, v.Data)
case redis.Subscription:
fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count)
case error:
return
}
}
redigo连接池
在实际的项目中要频繁的使用redis,如果每次连接,使用完毕断开连接,势必会造成效率低下。推荐使用redigo自带的连接池。
我们先来看下线程池结构体的信息:
type Pool struct {
//Dial 是创建链接的方法
Dial func() (Conn, error)
//TestOnBorrow 是一个测试链接可用性的方法
TestOnBorrow func(c Conn, t time.Time) error
// 最大的空闲连接数,表示即使没有redis连接时依然可以保持N个空闲的连接,而不被清除,随时处于待命状态
MaxIdle int
// 最大的激活连接数,表示同时最多有N个连接 ,为0事表示没有限制
MaxActive int
//最大的空闲连接等待时间,超过此时间后,空闲连接将被关闭
IdleTimeout time.Duration
// 当链接数达到最大后是否阻塞,如果不的话,达到最大后返回错误
Wait bool
}
如果使用:
RedisClient = &redis.Pool{
// 从配置文件获取maxidle以及maxactive,取不到则用后面的默认值
IdleTimeout: 180 * time.Second,
Dial: func() (redis.Conn, error) {
c, err := redis.Dial("tcp", REDIS_HOST)
if err != nil {
return nil, err
}
return c, nil
},
}
// 从池里获取连接
rc := RedisClient.Get()
// 用完后将连接放回连接池
defer rc.Close()