go语言redis使用,redigo

通过一个例子来学习redigo的使用,其中主要使用到了redis的订阅与发布功能,以及redis连接池的实现

redis操作:

  // tcp连接redis 

  rs, err := redis.Dial("tcp", host)

  // 操作完后自动关闭  

  defer rs.Close()

 // 操作redis时调用Do方法,第一个参数传入操作名称(字符串),然后根据不同操作传入key、value、数字等
 // 返回2个参数,第一个为操作标识,成功则为1,失败则为0;第二个为错误信息
 value, err := redis.String(rs.Do("GET", key))
 if err != nil {
    fmt.Println("fail")
 }

 若value的类型为int,则用redis.Int转换

 若value的类型为string,则用redis.String转换

 若value的类型为json,则用redis.Byte转换

 // 存json数据
 key := "aaa"
 imap := map[string]string{"key1": "111", "key2": "222"}
 // 将map转换成json数据
 value, _ := json.Marshal(imap)
 // 存入redis
 n, err := rs.Do("SETNX", key, value)
 if err != nil {
     fmt.Println(err)
 }
 if n == int64(1) {
     fmt.Println("success")
 }

// 取json数据
// 先声明imap用来装数据
var imap map[string]string
key := "aaa"
// json数据在go中是[]byte类型,所以此处用redis.Bytes转换
value, err := redis.Bytes(rs.Do("GET", key))
if err != nil {
fmt.Println(err)
}
// 将json解析成map类型
errShal := json.Unmarshal(value, &imap)
if errShal != nil {
fmt.Println(err)
}
fmt.Println(imap["key1"])
fmt.Println(imap["key2"])

订阅发布功能测试

package models

import (

"github.com/garyburd/redigo/redis"

"github.com/astaxie/beego"

"time"

"fmt"

)

var (

//定义常亮

RedisClient *redis.Pool

REDIS_HOST string

REDIS_PORT string

REDIS_DB int

)

func init() {

//从配置文件中获取redis的ip以及db

REDIS_HOST = beego.AppConfig.String("redis_host")

REDIS_PORT = beego.AppConfig.String("redis_port")

REDIS_DB = beego.AppConfig.DefaultInt("redis_db", 0)

// 建立连接池

RedisClient = &redis.Pool{

// 从配置文件获取maxidle以及maxactive,取不到则用后面的默认值

MaxIdle: beego.AppConfig.DefaultInt("redis_maxidle", 100),

MaxActive: beego.AppConfig.DefaultInt("redis_maxactive", 1024),

IdleTimeout: 180 * time.Second,

Dial: func() (redis.Conn, error) {

c, err := redis.Dial("tcp", REDIS_HOST+":"+REDIS_PORT)

if err != nil {

return nil, err

}

// 选择db

//c.Do("SELECT", REDIS_DB)

return c, nil

},

}

}

/**

*redis订阅信息

*

*/

func Subscribe() {

c := RedisClient.Get()

psc := redis.PubSubConn{c}

psc.Subscribe("redChatRoom")

defer func() {

c.Close()

psc.Unsubscribe("redChatRoom")  //取消订阅

} ()

for {

switch v := psc.Receive().(type) {

case redis.Message:

fmt.Printf("%s: messages: %s\n", v.Channel, v.Data)

case redis.Subscription:

//fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count)

continue

case error:

fmt.Println(v)

return

}

}

}

/**

*redis发布信息

*

*/

func Pubscribe(s string) {

c := RedisClient.Get()

defer c.Close()

_, err := c.Do("PUBLISH", "redChatRoom", s)

if err != nil {

fmt.Println("pub err: ", err)

return

}

}

func test() {

// 从池里获取连接

rc := RedisClient.Get()

// 用完后将连接放回连接池

defer rc.Close()

//rc.Do()

//n, _ := rc.Do("EXPIRE", key, 24*3600)

//value, err := redis.String(rs.Do("GET", key))

return

}