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")
    redisKey := beego.AppConfig.String("redis::key")
    config := fmt.Sprintf(`{"key":"%s","conn":"%s","dbNum":"%s","password":"%s"}`, redisKey, 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=""
key="demo"

我一般习惯用字符串,所以上面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("2006-01-02 15:04:05")),
        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"
)
复制代码

 

posted on   dz45693  阅读(2383)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示