go語言redis使用(redigo)

 

經過一個例子來學習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

相關文章
相關標籤/搜索