Initial commit
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user