【问题标题】:How to save data to redis from MySQL database in Golang beego framework?如何在Golang beego框架中将数据从MySQL数据库保存到redis?
【发布时间】: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

标签: database go redis beego


【解决方案1】:
  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)
}
  1. 结构到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】:

    您应该使用rediscron-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 来询问代码。或者您只需要针对您的问题的指导。有几种方法可以做到这一点,它们都有自己的缺点。

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-07-22
        • 2021-08-23
        • 1970-01-01
        • 1970-01-01
        • 2018-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多