diff --git a/domain/service/group_s/group.go b/domain/service/group_s/group.go index 00d75f45565b4286b43cc4923bceed890e6b1fe9..1985598414458fc17fe9313da2cecd7abd55a4f4 100644 --- a/domain/service/group_s/group.go +++ b/domain/service/group_s/group.go @@ -4,8 +4,8 @@ import ( "encoding/json" "git.hilo.cn/hilo-common/domain" "git.hilo.cn/hilo-common/mycontext" - "git.hilo.cn/hilo-common/resource/config" "git.hilo.cn/hilo-common/resource/mysql" + "github.com/bluele/gcache" "gorm.io/gorm" "hilo-group/_const/enum/group_e" "hilo-group/_const/enum/mgr_e" @@ -18,7 +18,6 @@ import ( "hilo-group/domain/model/user_m" "hilo-group/domain/service/signal_s" "hilo-group/myerr" - "strconv" "time" ) @@ -31,7 +30,7 @@ func NewGroupService(myContext *mycontext.MyContext) *GroupService { return &GroupService{svc} } -// 取本周最高的扶持等级 fixme:删除这个过渡函数 +// 取本周最高的扶持等级 func (s *GroupService) GetWeekMaxSupportLevelMap() (map[string]uint8, error) { return s.GetSupportLevelMap(time.Now().AddDate(0, 0, -group_e.SUPPORT_LEVEL_PERIOD_DAY)) } @@ -42,90 +41,57 @@ func (s *GroupService) GetSupportLevelMap(now time.Time) (map[string]uint8, erro _, _, period := group_m.GetSupportLevelTime(now) levels, err := GetAllSupportLevel(model, period) - if err != nil { - return nil, err + if err == nil { + return levels, nil } - model.Log.Debugf("GetSupportLevelMap, GET %s: %v", period, levels) + // cache miss - result := make(map[string]uint8, 0) - if len(levels) > 0 { - for g, l := range levels { - le, err := strconv.ParseUint(l, 10, 8) - if err == nil { - result[g] = uint8(le) - } - } - } else { - result, err = group_m.GetAllGroupSupportResult(model.Db, period) - if err == nil { - ret, err := SaveAllSupportLevel(model, period, result) - model.Log.Infof("GetSupportLevelMap SAVE ret = %d, err: %v", ret, err) - } + result, err := group_m.GetAllGroupSupportResult(model.Db, period) + if err == nil { + SaveAllSupportLevel(model, period, result) } return result, nil } -// 取本周最高的扶持等级 -func (s *GroupService) GetWeekMaxSupportLevelMapByIds(groupIds []string) (map[string]uint8, error) { - return s.GetSupportLevelMapByIds(groupIds, time.Now().AddDate(0, 0, -group_e.SUPPORT_LEVEL_PERIOD_DAY)) -} - -func (s *GroupService) GetSupportLevelMapByIds(groupIds []string, now time.Time) (map[string]uint8, error) { - model := domain.CreateModel(s.svc.CtxAndDb) - - _, _, period := group_m.GetSupportLevelTime(now) - - levels, err := GetAllSupportLevel(model, period) - if err != nil { - return nil, err - } - model.Log.Debugf("GetSupportLevelMapByIds, GET %s: %v", period, levels) +//// 取本周最高的扶持等级 +//func (s *GroupService) GetWeekMaxSupportLevelMapByIds(groupIds []string) (map[string]uint8, error) { +// return s.GetSupportLevelMapByIds(groupIds, time.Now().AddDate(0, 0, -group_e.SUPPORT_LEVEL_PERIOD_DAY)) +//} +// +//func (s *GroupService) GetSupportLevelMapByIds(groupIds []string, now time.Time) (map[string]uint8, error) { +// model := domain.CreateModel(s.svc.CtxAndDb) +// +// _, _, period := group_m.GetSupportLevelTime(now) +// +// levels, err := GetAllSupportLevel(model, period) +// if err == nil { +// return levels, nil +// } +// // cache miss +// +// result, err := group_m.GetGroupSupportResult(model.DB(), period, groupIds) +// if err == nil { +// SaveAllSupportLevel(model, period, result) +// } +// return result, nil +//} - result := make(map[string]uint8, 0) - if len(levels) > 0 { - for g, l := range levels { - le, err := strconv.ParseUint(l, 10, 8) - if err == nil { - result[g] = uint8(le) - } - } - } else { - result, err = group_m.GetGroupSupportResult(model.DB(), period, groupIds) - if err == nil { - ret, err := SaveAllSupportLevel(model, period, result) - model.Log.Infof("GetSupportLevelMapByIds SAVE ret = %d, err: %v", ret, err) - } - } - return result, nil -} +// supportLevelLru Cache +var supportLevelCache = gcache.New(100).LRU().Build() -func SaveAllSupportLevel(model *domain.Model, date string, levels map[string]uint8) (int64, error) { - values := make(map[string]interface{}, 0) - for g, l := range levels { - if l > 0 { - values[g] = l - } - } - if len(values) <= 0 { - return 0, nil - } +func SaveAllSupportLevel(model *domain.Model, date string, levels map[string]uint8) { key := redis_key.GetPrefixSupportLevel(date) - ret, err := model.Redis.HSet(model, key, values).Result() - - if err == nil { - // 设置一个TTL保险一些 TODO: 可以优化,保证数据总是有的 - ttl := time.Hour - if !config.AppIsRelease() { - ttl = time.Minute - } - model.Redis.Expire(model, key, ttl) - } - return ret, err + _ = supportLevelCache.SetWithExpire(key, levels, time.Hour) + return } -func GetAllSupportLevel(model *domain.Model, date string) (map[string]string, error) { +func GetAllSupportLevel(model *domain.Model, date string) (map[string]uint8, error) { key := redis_key.GetPrefixSupportLevel(date) - return model.Redis.HGetAll(model, key).Result() + if data, err := supportLevelCache.Get(key); err == nil { + return data.(map[string]uint8), nil + } else { + return map[string]uint8{}, err + } } func (s *GroupService) GetJoinGroupLimit(userId mysql.ID) (uint, error) { diff --git a/route/group_r/group_list.go b/route/group_r/group_list.go index ca167709004241925bd8fc81c6a62defc2940a0c..7f5e4e16bb7a8076eb62bfca9ba2db4fe142f1ac 100644 --- a/route/group_r/group_list.go +++ b/route/group_r/group_list.go @@ -1712,7 +1712,7 @@ func GetGroupByCountryV2(c *gin.Context) (*mycontext.MyContext, error) { // 正在进行的游戏 games := game_m.GetNotEndGamesMap(model) // 扶持等级 - supportLevels, err := group_s.NewGroupService(myContext).GetWeekMaxSupportLevelMapByIds(groupIds) + supportLevels, err := group_s.NewGroupService(myContext).GetWeekMaxSupportLevelMap() if err != nil { return myContext, err }