如何在Golang beego框架中将数据从MySQL数据库保存到redis?

Posted

技术标签:

【中文标题】如何在Golang beego框架中将数据从MySQL数据库保存到redis?【英文标题】:How to save data to redis from MySQL database in Golang beego framework? 【发布时间】:2021-12-31 12:25:27 【问题描述】:

我正在尝试从 mysql 数据库中获取数据,并在每 6 小时后将其存储在 redis 上。我是redis的新手。我想使用 Select * from table_name 从 MySQL DB 获取数据。然后将这些数据存储到redis中。 Golang Beego框架中有没有存储数据和从redis获取数据的例子?

【问题讨论】:

你可以尝试使用ticker来触发你的Redis缓存刷新,不管beego/mux/gin 【参考方案1】:
    您可以使用 go-redis 和 redi-go 作为工具连接 redis,然后选择您需要的数据类型。

示例:go-redis:

https://github.com/go-redis/redis

var ctx = context.Background()

func ExampleClient() 
    //01 connect
    rdb := redis.NewClient(&redis.Options
        Addr:     "localhost:6379",
        Password: "", // no password set
        DB:       0,  // use default DB
    )
    err := rdb.Set(ctx, "key", "value", 0).Err()
    if err != nil 
        panic(err)
    
    val, err := rdb.Get(ctx, "key").Result()
    if err != nil 
        panic(err)
    
    fmt.Println("key", val)

    结构到redis

类型用户结构 用户 ID uint32 用户名字符串 var ctx = context.Background()

// Set set to redis as string
func Set() 
    var u User
    marshal, err := json.Marshal(&u)
    if err != nil 
        log.Println(err)
    
    rdb.Set(ctx,"user",string(marshal),-1)
    //-1 means no expiration time


// Get get from redis
func Get() 
    var u User
    bytes, err := rdb.Get(ctx, "user").Bytes()
    if err != nil 
        log.Println(err)
    
    err = json.Unmarshal(bytes, &u)
    if err != nil 
        log.Println(err)
    

【讨论】:

【参考方案2】:

您应该使用redis 和cron-job。因为,您希望每 6 小时将数据存储在 redis 中。

我为您的场景创建了一个示例示例,如下所示:

func SetData(c *RedisClient, key string, value interface)
 
        //-1 means no expiration time
        err := c.Set(ctx,key,value,-1).Err()
   
       if err != nil
         panic(err)
       



func GetData() 

    //fetch your table data from database
    //take instance of redis client
    //call SetData()
        //var user_val model.User
    //assuming you have fetched data in user_val

    SetData(redis_client_instance, "user", user_val)

现在,在 cron-job 中调用 GetData(),它从午夜 12 点开始,并在 redis 中每隔 6 点添加一次数据。

 //pick the start time inside NewScheduler
 //if you want you can load your zone time.
    s := gocron.NewScheduler(time.UTC)
    
    s.Every(6).Hours().Do(GetData)

【讨论】:

【参考方案3】:

我不确定您是否通过使用 Beego 来询问代码。或者您只需要针对您的问题的指导。有几种方法可以做到这一点,它们都有自己的缺点。

    使用票证或 cronjob 加载最近 6 小时的数据。在下一次代码运行之前,您无法从缓存中读取最新的更新或插入。

    在 MYSQL 和 REDIS 中双重写入。 REDIS 缓存可以预热一次以加载最近 6 小时的数据。当你写MYSQL成功但REDIS失败时,可能是REDIS和MYSQL的数据不一致。

    订阅MYSQL的bin日志,重放REDIS上的所有bin日志。你可能会在 Github 上找到一些开源项目来做这件事。对于这个问题,这是一个复杂的解决方案,但在 IT 公司中确实很常见。

【讨论】:

以上是关于如何在Golang beego框架中将数据从MySQL数据库保存到redis?的主要内容,如果未能解决你的问题,请参考以下文章

golang的beego框架开发时出现的问题纪录

如何使用go语言的beego框架的orm

golang web框架 beego 学习 beego获取参数

Golang入门教程beego 快速开发 HTTP 框架

golang web框架 beego 学习 连接mysql

golang web框架 beego 学习 配置文件