經過一個例子來學習redigo的使用,其中主要使用到了redis的訂閱與發佈功能,以及redis鏈接池的實現git
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"])
訂閱發佈功能測試github
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
}redis