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
相关产品推荐
相关产品推荐

