forked from all_user/stat_center
85 lines
2.3 KiB
Go
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
|
|
}
|