這篇講講如何在beego框架使用redis。git
golang中比較好用的第三方開源redisclient有:github
cd /data/work/go
2.下載redisgolang
go get -u github.com/astaxie/beego/cache/redis
3.安裝完上述步驟以後,會在$GOPATH/src/github.com/gomodule下邊有個redigo,如圖redis
4.在使用的時候引入vim
import "github.com/gomodule/redigo/redis"
注意:app
1.當使用beego不須要模版的時候,能夠在配置文件中關閉,以免沒必要要的報錯,默認是加載模版的,vim app/config,加入以下行框架
autorender = false
2.當go get github.com/**比較慢的時候,能夠查到該host對應的ip,而後配到/etc/hoststcp
先用ip查找工具查到github.com對應的ip函數
如圖,而後在/etc/hosts加入以下代碼工具
192.30.253.112 github.com
好了,那咱們就寫個程序來驗證下beego和redis的使用吧。
package controllers import ( "github.com/astaxie/beego" "github.com/gomodule/redigo/redis" "fmt" "time" ) const PASSWORD string = "******" const OK string = "ok" const NO string = "no" type DictController struct { beego.Controller } func newPool(idc, prekey string) *redis.Pool { var redisConn map[string]string = map[string]string{ "beijing":"127.0.0.1:6379", "tianjin":"10.10.10.10:6379"} return &redis.Pool { MaxIdle:3, IdleTimeout: 240 * time.Second, Dial: func () (redis.Conn, error) { c, err := redis.Dial("tcp", redisConn[idc]) if err != nil { return nil, err } if _, err := c.Do("AUTH", PASSWORD); err != nil { c.Close() return nil, err } if _, err := c.Do("SELECT", 0); err != nil { c.Close() return nil, err } return c, nil }, } } func (c *DictController) GetDictData() string { userid,err := c.GetInt("userid") idc :=c.GetString("idc") prekey :=c.GetString("prekey") if err != nil { fmt.Printf("用戶id[%d]參數出錯", userid) return NO } var pool *redis.Pool = newPool(idc, prekey) conn := pool.Get() value, err := conn.Do("lrange", prekey, 0, -1) if err != nil { fmt.Printf("用戶id[%d]從redis讀取數據出錯", userid) return NO } type ids []int data,_ := redis.Ints(value, err) for _,v := range data { if v==userid { fmt.Printf("用戶id[%d]在黑名單中", userid) return OK } } fmt.Printf("用戶id[%d]不在黑名單中", userid) return NO }
注意:
1.助手函數
data,_ := redis.Ints(value, err)這行很關鍵,當從redis讀取的數據不能用單純的go的類型轉換去轉換,必定要用redis自帶的回覆助手函數去轉,不然轉出來的是不正確的。
在開始的官方文檔中有提到,叫reply helper
reply helper functions(回覆助手函數)
Bool,Int,Bytes,map,String,Strings和Values函數將回復轉換爲特定類型的值。爲了方便地包含對鏈接Do和Receive方法的調用,這些函數採用了類型爲error的第二個參數。若是錯誤是非nil,則輔助函數返回錯誤。若是錯誤爲nil,則該函數將回復轉換爲指定的類型
2.歸還鏈接池
當使用完以後,必定要記得歸還鏈接池,不然會一直佔用端口,壓測一直上不去,就是這個問題
defer conn.Close(),以下紅色代碼,添加一行歸還的操做
func (c *DictController) GetDictData() string { userid,err := c.GetInt("userid") idc :=c.GetString("idc") prekey :=c.GetString("prekey") if err != nil { fmt.Printf("用戶id[%d]參數出錯", userid) return NO } var pool *redis.Pool = newPool(idc, prekey) conn := pool.Get() defer conn.Close() value, err := conn.Do("lrange", prekey, 0, -1) if err != nil { fmt.Printf("用戶id[%d]從redis讀取數據出錯", userid) return NO } type ids []int data,_ := redis.Ints(value, err) for _,v := range data { if v==userid { fmt.Printf("用戶id[%d]在黑名單中", userid) return OK } } fmt.Printf("用戶id[%d]不在黑名單中", userid) return NO }