go系列(3)

这篇讲讲如何在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的使用吧。

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}
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

go系列(3) - HelloWorld