在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
这篇讲讲如何在beego框架使用redis。 golang中比较好用的第三方开源redisclient有:
第一种的使用见该篇文档 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的使用吧。 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(回复助手函数) 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 }
|
请发表评论