Files
2026-05-20 16:13:58 +08:00

85 lines
2.3 KiB
Go

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
}