这篇讲讲如何在beego框架使用redis。
golang中比较好用的第三方开源redisclient有:
- go-redis
- redigo
第一种的使用见该篇文档 https://www.jianshu.com/p/80f83e42ee11
本文主要讲述第二种的使用。
1.接上两篇文章,切换到工作目录
cd /data/work/go
2.下载redis
go get -u github.com/astaxie/beego/cache/redis
3.安装完上述步骤之后,会在$GOPATH/src/github.com/gomodule下边有个redigo,如图

4.在使用的时候引入
import "github.com/gomodule/redigo/redis"
注意:
1.当使用beego不需要模版的时候,可以在配置文件中关闭,以避免不必要的报错,默认是加载模版的,vim app/config,加入如下行
autorender = false
2.当go get github.com/**比较慢的时候,可以查到该host对应的ip,然后配到/etc/hosts
先用ip查找工具查到github.com对应的ip

如图,然后在/etc/hosts加入如下代码
192.30.253.112 github.com
好了,那我们就写个程序来验证下beego和redis的使用吧。
1package controllers 2 3import ( 4 "github.com/astaxie/beego" 5 "github.com/gomodule/redigo/redis" 6 "fmt" 7 "time" 8) 9 10const PASSWORD string = "******" 11const OK string = "ok" 12const NO string = "no" 13 14type DictController struct { 15 beego.Controller 16} 17 18func newPool(idc, prekey string) *redis.Pool { 19 var redisConn map[string]string = map[string]string{ 20 "beijing":"127.0.0.1:6379", 21 "tianjin":"10.10.10.10:6379"} 22 23 return &redis.Pool { 24 MaxIdle:3, 25 IdleTimeout: 240 * time.Second, 26 Dial: func () (redis.Conn, error) { 27 c, err := redis.Dial("tcp", redisConn[idc]) 28 if err != nil { 29 return nil, err 30 } 31 if _, err := c.Do("AUTH", PASSWORD); err != nil { 32 c.Close() 33 return nil, err 34 } 35 if _, err := c.Do("SELECT", 0); err != nil { 36 c.Close() 37 return nil, err 38 } 39 return c, nil 40 }, 41 } 42} 43 44func (c *DictController) GetDictData() string { 45 userid,err := c.GetInt("userid") 46 idc :=c.GetString("idc") 47 prekey :=c.GetString("prekey") 48 if err != nil { 49 fmt.Printf("用户id[%d]参数出错", userid) 50 return NO 51 } 52 53 var pool *redis.Pool = newPool(idc, prekey) 54 conn := pool.Get() 55 value, err := conn.Do("lrange", prekey, 0, -1) 56 if err != nil { 57 fmt.Printf("用户id[%d]从redis读取数据出错", userid) 58 return NO 59 } 60 type ids []int 61 data,_ := redis.Ints(value, err) 62 for _,v := range data { 63 if v==userid { 64 fmt.Printf("用户id[%d]在黑名单中", userid) 65 return OK 66 } 67 } 68 fmt.Printf("用户id[%d]不在黑名单中", userid) 69 return NO 70}
注意:
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(),如下红色代码,添加一行归还的操作
1func (c *DictController) GetDictData() string { 2 userid,err := c.GetInt("userid") 3 idc :=c.GetString("idc") 4 prekey :=c.GetString("prekey") 5 if err != nil { 6 fmt.Printf("用户id[%d]参数出错", userid) 7 return NO 8 } 9 10 var pool *redis.Pool = newPool(idc, prekey) 11 conn := pool.Get() 12 13 defer conn.Close() 14 15 value, err := conn.Do("lrange", prekey, 0, -1) 16 if err != nil { 17 fmt.Printf("用户id[%d]从redis读取数据出错", userid) 18 return NO 19 } 20 type ids []int 21 data,_ := redis.Ints(value, err) 22 for _,v := range data { 23 if v==userid { 24 fmt.Printf("用户id[%d]在黑名单中", userid) 25 return OK 26 } 27 } 28 fmt.Printf("用户id[%d]不在黑名单中", userid) 29 return NO 30}