zoukankan      html  css  js  c++  java
  • go系列(3)- go框架beego以及redis的使用

    这篇讲讲如何在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(回复助手函数)
    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
    }
  • 相关阅读:
    Leetcode 1489找到最小生成树李关键边和伪关键边
    Leetcode 113 路径总和 II
    hdu 1223 还是畅通工程
    hdu 1087 Super Jumping! Jumping! Jumping!
    hdu 1008 Elevator
    hdu 1037 Keep on Truckin'
    湖工oj 1241 畅通工程
    湖工oj 1162 大武汉局域网
    hdu 2057 A + B Again
    poj 2236 Wireless Network
  • 原文地址:https://www.cnblogs.com/kumufengchun/p/10271576.html
Copyright © 2011-2022 走看看