package repository import ( "city_chips/pkg/log" "context" "fmt" "github.com/redis/go-redis/v9" "github.com/spf13/viper" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "runtime" "time" ) type Repository struct { db *gorm.DB rdb *redis.Client logger *log.Logger } func NewRepository(logger *log.Logger, db *gorm.DB, rdb *redis.Client) *Repository { return &Repository{ db: db, rdb: rdb, logger: logger, } } func NewDb(conf *viper.Viper, l *log.Logger) *gorm.DB { // TODO: init db sysType := runtime.GOOS config := gorm.Config{} if sysType == "windows" { config.Logger = logger.Default.LogMode(logger.Info) config.DisableForeignKeyConstraintWhenMigrating = true } else if sysType == "linux" { config.DisableForeignKeyConstraintWhenMigrating = true } db, err := gorm.Open(mysql.Open(conf.GetString("data.mysql.user")), &config) sqlDB, err := db.DB() // 设置最大连接数 sqlDB.SetMaxOpenConns(20) // 设置最大打开连接数 // 设置空闲连接数 sqlDB.SetMaxIdleConns(200) // 设置最大空闲连接数 // 设置连接的最大存活时间 sqlDB.SetConnMaxLifetime(time.Hour) // 设置连接的最大存活时间为1小时 if err != nil { panic(err) } return db } func NewRedis(conf *viper.Viper) *redis.Client { rdb := redis.NewClient(&redis.Options{ Addr: conf.GetString("data.redis.addr"), Password: conf.GetString("data.redis.password"), DB: conf.GetInt("data.redis.db"), }) ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() _, err := rdb.Ping(ctx).Result() if err != nil { panic(fmt.Sprintf("redis error: %s", err.Error())) } return rdb }