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
}