如何在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?的主要内容,如果未能解决你的问题,请参考以下文章