package limitstat import ( "encoding/json" "sort" "stat/common/log" "stat/common/redis" "stat/service/cacheSer" "stat/statg" "time" ) var mgr *redis.Manager func getRedisMgr() (*redis.Manager, error) { if mgr == nil { m, err := redis.NewManagerWithUrl(statg.Conf.Redis.Url, func(opt *redis.Options) { opt.ReadTimeout = 60 * time.Second }) if err != nil { return nil, err } mgr = m } return mgr, nil } func IpAddressLimitStat() error { m, err := getRedisMgr() if err != nil { log.Error("get redis mgr failed", log.E(err)) return err } var piece = 1000 todayList := make(redis.BucketList, 0) today := time.Now().Local() todayKey := redis.GetIpLimitSpecifiedDayKey(statg.Conf.Host, statg.Conf.Port, today) todayHash := redis.NewHash(m.Client(), todayKey) if err := todayHash.Scan("", int64(piece), func(name, value string) { bucket := redis.Bucket{} if err := json.Unmarshal([]byte(value), &bucket); err == nil { bucket.Name = name todayList = append(todayList, &bucket) } }); err != nil { return err } sort.Sort(todayList) cacheSer.IpLimitStatCache.Lock.Lock() if len(todayList) >= 1000 { cacheSer.IpLimitStatCache.IpLimitBucketTopToday = todayList[:1000] } else { cacheSer.IpLimitStatCache.IpLimitBucketTopToday = todayList[:] } cacheSer.IpLimitStatCache.Lock.Unlock() yesterday := today.Add(-24 * time.Hour) yesterdayKey := redis.GetIpLimitSpecifiedDayKey(statg.Conf.Host, statg.Conf.Port, yesterday) history := redis.NewHash(m.Client(), redis.IpLimiterDayRecordKey) if exists, err := history.Exists(yesterdayKey); err != nil || exists { return err } yesterdayList := make(redis.BucketList, 0) yesterdayHash := redis.NewHash(m.Client(), yesterdayKey) if err := yesterdayHash.Scan("", int64(piece), func(name, value string) { bucket := redis.Bucket{} if err := json.Unmarshal([]byte(value), &bucket); err == nil { bucket.Name = name yesterdayList = append(yesterdayList, &bucket) } }); err != nil { return err } sort.Sort(yesterdayList) cacheSer.IpLimitStatCache.Lock.Lock() if len(yesterdayList) >= 1000 { cacheSer.IpLimitStatCache.IpLimitBucketTopToday = yesterdayList[:1000] } else { cacheSer.IpLimitStatCache.IpLimitBucketTopToday = yesterdayList[:] } cacheSer.IpLimitStatCache.Lock.Unlock() _, err = history.Set(yesterdayKey, "1") return err }