package svc import ( "context" "gitea.youtukeji.com.cn/xiabin/youtu_grpc/app/ranking_management/internal/logic/rankings" "gitea.youtukeji.com.cn/xiabin/youtu_grpc/pkg/config" "gitea.youtukeji.com.cn/xiabin/youtu_grpc/pkg/my_gorm" "gitea.youtukeji.com.cn/xiabin/youtu_grpc/pkg/my_gorm/gen/dao/query" "github.com/redis/go-redis/v9" "gorm.io/driver/mysql" "gorm.io/gorm" ) type ServiceContext struct { Config config.Config Query *query.Query RedisRanking *rankings.Ranking } func NewServiceContext(c config.Config) *ServiceContext { svc := &ServiceContext{ Config: c, } //初始化redis client redisClient := redis.NewClient(&redis.Options{ Addr: c.Redis[0].Host, }) //初始化数据库 db, err := my_gorm.NewDBWithCache(mysql.Open(c.Mysql), &gorm.Config{}, redisClient) if err != nil { panic(err) } svc.Query = query.Use(db) //初始化排行榜对象 svc.InitRankings(redisClient) return svc } func (svc *ServiceContext) InitRankings(redisClient *redis.Client) { //初始化排行榜对象 svc.RedisRanking = rankings.NewRanking(redisClient) //获取所有不同的排行榜 gs := svc.Query.GameScore r, err := gs.FindDistinctRanking() if err != nil { panic(err) } //获取所有排行榜 for _, ranking := range r { scores, err := gs.Where(gs.AppAccount.Eq(ranking.AppAccount), gs.T.Eq(ranking.T)).Find() if err != nil { panic(err) } data := make([]redis.Z, 0, len(scores)) for _, score := range scores { data = append(data, redis.Z{ Score: float64(uint64(score.Score)<<32 + uint64(score.UpdatedAt.Unix())), Member: score.AppUserID, }) } svc.RedisRanking.SetList(context.Background(), rankings.GetRankingsCacheKey(ranking.AppAccount, ranking.T), data...) } }