目录

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()