1. 程式人生 > 實用技巧 >beego redis作為快取

beego redis作為快取

用redis來作為cach其實官網已經很詳細了https://beego.me/docs/module/cache.md,只是我一般喜歡封裝成通用方法
直接上程式碼吧 redis.go作為通用工具類:

package redis

import (
    "fmt"
    "time"

    "github.com/astaxie/beego"
    "github.com/astaxie/beego/cache"
    _ "github.com/astaxie/beego/cache/redis"
    _ "github.com/gomodule/redigo/redis"
)

var redisCache cache.Cache

func init() {
    redisHost :
= beego.AppConfig.String("redis::address") dataBase := beego.AppConfig.String("redis::database") password := beego.AppConfig.String("redis::password") config := fmt.Sprintf(`{"key":"demo","conn":"%s","dbNum":"%s","password":"%s"}`, redisHost, dataBase, password) var err error redisCache, err
= cache.NewCache("redis", config) if err != nil || redisCache == nil { errMsg := "failed to init redis" beego.Error(errMsg, err) panic(errMsg) } } func SetStr(key, value string, time time.Duration) (err error) { err = redisCache.Put(key, value, time) if err != nil { beego.Error(
"set key:", key, ",value:", value, err) } return } func GetStr(key string) (value string) { v := redisCache.Get(key) value = string(v.([]byte)) //這裡的轉換很重要,Get返回的是interface return } func DelKey(key string) (err error) { err = redisCache.Delete(key) return }

使用的時候需要修改配置檔案app.conf

[redis]
address=localhost:6379
database=0
password=""

我一般習慣用字串,所以上面redis封裝的也是string, 如果是物件就用json 序列化和返序列化,使用示例:

func (c *MainController) Get() {
    //宣告物件
    type TokenView struct {
        Token     string
        LoginTime string
        LoginIp   string
    }
    //例項化
    t := TokenView{
        Token:     string(xid.New().String()),
        LoginTime: string(time.Now().Format("2020-12-20 16:46:00")),
        LoginIp:   strings.TrimSpace(c.Ctx.Input.IP()),
    }
    //json序列化
    str, err := json.Marshal(t)
    if err != nil {
        fmt.Print(err)
    }
    ///redis儲存
    redis.SetStr("test", string(str), time.Minute*time.Duration(10))
    //redis獲取
    v := redis.GetStr("test")
    fmt.Println(v)
    //json反序列化
    var obj TokenView
    json.Unmarshal([]byte(v), &obj)
    fmt.Println(obj.Token)

    c.TplName = "index.html"
}

必要的包還是 要引入的:

import( "demo/redis" "encoding/json" "fmt" "strings" "time"
"github.com/astaxie/beego" "github.com/rs/xid" )