package cacheSer import ( "runtime" "stat/common/log" "stat/common/redis" "stat/common/statutils" "sync" "time" "github.com/robfig/cron/v3" "github.com/patrickmn/go-cache" ) type IpStatCache struct { Lock sync.RWMutex IpLimitBucketTopToday redis.BucketList IpLimitBucketTopYesterday redis.BucketList } var ( Cache *cache.Cache IpLimitStatCache = IpStatCache{ IpLimitBucketTopToday: make(redis.BucketList, 0), IpLimitBucketTopYesterday: make(redis.BucketList, 0), } Writers struct { LandPageVisitWriter BaseWriter LandPageClickWriter BaseWriter } _cron *cron.Cron ) func Init() { Cache = cache.New(10*time.Minute, 10*time.Minute) Writers.LandPageVisitWriter = NewWriter(landPageVisitSync) Writers.LandPageClickWriter = NewWriter(landPageClickSync) _cron = cron.New(cron.WithSeconds(), cron.WithChain(cron.SkipIfStillRunning(&log.Logger{}))) // 秒级定时任务 _, _ = _cron.AddFunc("*/5 * * * * ?", func() { err := statutils.ServerMon.RunWithName(SyncWriters, statutils.GetFuncName(SyncWriters)) if err != nil { log.Error("SyncWriters err", log.E(err)) } }) _cron.Start() } func SyncWriters() error { err := Writers.LandPageVisitWriter.Sync() if err != nil { return err } return Writers.LandPageClickWriter.Sync() } func Key(key string) string { pc, _, _, _ := runtime.Caller(1) return runtime.FuncForPC(pc).Name() + "##" + key }