package timer import ( "fmt" "math/rand" "time" "github.com/didi/nightingale/v5/cache" "github.com/didi/nightingale/v5/models" "github.com/toolkits/pkg/logger" ) // userid->user 将数据库中的用户信息缓存在内存里, // 在生成告警事件的时候,根据用户ID快速找到用户的详情 func SyncUsers() { err := syncUsers() if err != nil { fmt.Println("timer: sync users fail:", err) exit(1) } go loopSyncUsers() } func loopSyncUsers() { randtime := rand.Intn(9000) fmt.Printf("timer: sync users: random sleep %dms\n", randtime) time.Sleep(time.Duration(randtime) * time.Millisecond) for { time.Sleep(time.Second * time.Duration(9)) err := syncUsers() if err != nil { logger.Warning("timer: sync users fail:", err) } } } func syncUsers() error { start := time.Now() users, err := models.UserGetAll() if err != nil { return err } usersMap := make(map[int64]*models.User) for i := range users { usersMap[users[i].Id] = &users[i] } cache.UserCache.SetAll(usersMap) logger.Debugf("timer: sync users done, cost: %dms", time.Since(start).Milliseconds()) return nil }