You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang Beego框架下如何将MySQL数据存储到Redis,有相关示例吗?

Beego框架MySQL全量定时同步Redis实现指南

前置依赖配置

  • 安装所需依赖包:
go get github.com/astaxie/beego/cache
go get github.com/gomodule/redigo/redis
go get github.com/astaxie/beego/orm
go get github.com/go-sql-driver/mysql
  • 在conf/app.conf中添加基础配置:
# Redis配置
redis_addr = "127.0.0.1:6379"
redis_password = ""
redis_db = 0
# MySQL配置
db_user = root
db_pass = your_password
db_host = 127.0.0.1
db_port = 3306
db_name = your_database
  • 提前初始化Beego ORM的MySQL连接,此处省略常规ORM初始化逻辑。

1. Beego下Redis基础读写示例

1.1 初始化Redis客户端

package main

import (
    "encoding/json"
    "github.com/astaxie/beego"
    "github.com/astaxie/beego/cache"
    _ "github.com/astaxie/beego/cache/redis"
    "time"
)

var RedisClient cache.Cache

func InitRedis() error {
    redisConf := map[string]string{
        "conn":     beego.AppConfig.String("redis_addr"),
        "dbNum":    beego.AppConfig.String("redis_db"),
        "password": beego.AppConfig.String("redis_password"),
    }
    confBytes, err := json.Marshal(redisConf)
    if err != nil {
        return err
    }
    RedisClient, err = cache.NewCache("redis", string(confBytes))
    return err
}

1.2 基础读写操作示例

// 写入数据,第三个参数为过期时间
err := RedisClient.Put("demo:key", "demo_value", 7*time.Hour)
if err != nil {
    beego.Error("Redis写入失败:", err)
}

// 读取数据
val := RedisClient.Get("demo:key")
if val != nil {
    // 注意返回值为[]byte类型,需自行转换
    beego.Info("读取结果:", string(val.([]byte)))
}

// 删除数据
err = RedisClient.Delete("demo:key")
if err != nil {
    beego.Error("Redis删除失败:", err)
}

提示:Redis中存储结构化数据建议用JSON序列化,读取后反序列化为对应结构体即可。


2. 6小时定时同步MySQL到Redis完整流程

2.1 定义表结构体

以同步user表为例,先定义对应ORM结构体:

type User struct {
    Id   int    `orm:"column(id)"`
    Name string `orm:"column(name)"`
    Age  int    `orm:"column(age)"`
}

func (u *User) TableName() string {
    return "user"
}

2.2 实现同步逻辑

func SyncMysqlToRedis() error {
    // 1. 全表查询MySQL数据
    var users []User
    _, err := orm.NewOrm().QueryTable("user").All(&users)
    if err != nil {
        beego.Error("MySQL全表查询失败:", err)
        return err
    }

    // 2. 序列化数据为JSON
    usersJson, err := json.Marshal(users)
    if err != nil {
        beego.Error("数据序列化失败:", err)
        return err
    }

    // 3. 写入Redis,过期时间设为7小时(比同步间隔长1小时,避免同步间隙数据过期)
    err = RedisClient.Put("sync:mysql:user", usersJson, 7*time.Hour)
    if err != nil {
        beego.Error("同步数据写入Redis失败:", err)
        return err
    }

    beego.Info("同步完成,共写入", len(users), "条数据")
    return nil
}

2.3 注册6小时定时任务

在main.go中注册定时任务:

import (
    "github.com/astaxie/beego"
    "github.com/astaxie/beego/orm"
    "github.com/astaxie/beego/toolbox"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    // 初始化Redis
    if err := InitRedis(); err != nil {
        beego.Error("Redis初始化失败:", err)
        panic(err)
    }

    // 初始化MySQL ORM连接(此处省略常规ORM配置逻辑)
    orm.RegisterDataBase("default", "mysql", "root:your_password@tcp(127.0.0.1:3306)/your_db?charset=utf8")

    // 创建定时任务:cron表达式为 秒 分 时 日 月 周,此处配置为每6小时整点执行
    syncTask := toolbox.NewTask("mysql-to-redis-sync", "0 0 */6 * * *", SyncMysqlToRedis)
    // 注册并启动任务
    toolbox.AddTask("mysql-to-redis-sync", syncTask)
    toolbox.StartTask()
    defer toolbox.StopTask()

    beego.Run()
}

注意事项

  • 若表数据量超过10万条,不建议直接全表查询,建议分页批量读取写入,避免服务OOM
  • 同步时可先写入临时Key,写入完成后再重命名为正式Key,避免同步过程中业务读取到不完整数据
  • 如需单条数据快速查询,可按主键作为Redis Key单独存储每行数据,无需存全量JSON

内容的提问来源于stack exchange,提问作者Md. Sakhawath Hossain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:24:09