通过一个例子来学习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 }
|
请发表评论