package biz import ( "errors" "fmt" "sync" "time" go_redis_orm "github.com/fananchong/go-redis-orm.v2" "github.com/go-kratos/kratos/v2/log" v1 "sandc/api/eonline/v1" "sandc/app/eonline/internal/conf" ) var ( G_SvrData *SvrData MutexSvrData sync.RWMutex ERR_INIT_USER_DATA = errors.New("init db user data error") ) const ( db_name = "my_redis_db" NS2MS int64 = 1_000_000 // 纳秒转换成毫秒,需要的被除数 ) func InitSvrData(bootstrap *conf.Bootstrap) { go_redis_orm.SetNewRedisHandler(go_redis_orm.NewDefaultRedisClient) err := go_redis_orm.CreateDB(db_name, []string{bootstrap.Data.Redis.Addr}, bootstrap.Data.Redis.Password, int(bootstrap.Data.Redis.Db)) if nil != err { log.Fatalf("go_redis_orm.CreateDB err: dbName[%v] Idx[%v] Redis[%v] err[%v]", db_name, bootstrap.Data.Redis.Db, bootstrap.Data.Redis.Addr, err) } err = loadSvrData(uint32(bootstrap.Server.SvrId)) if err != nil { log.Fatal("loadSvrData error: %v", err) } else { log.Infof("loadSvrData success") } } func SaveSvrDataOnTimer() { begin := time.Now().UnixNano() var save map[string]interface{} getSaveDataSvrData(&save) var err error go func() { begin := time.Now().UnixNano() err = saveDataSvrData(&save) if err != nil { log.Infof("saveDataSvrData error: %v", err) } save = nil end := time.Now().UnixNano() delta := end - begin log.Infof("saveDataSvrData: begin[%dns] end[%dns], spend[%dms %dns]", begin, end, delta/NS2MS, delta%NS2MS) }() end := time.Now().UnixNano() delta := end - begin log.Infof("SaveSvrDataOnTimer: begin[%dns] end[%dns], spend[%dms %dns]", begin, end, delta/NS2MS, delta%NS2MS) } func SaveSvrDataShutDown() { begin := time.Now().UnixNano() err := saveDataSvrData2() if err != nil { log.Infof("saveSvrDataShutDown error: %v", err) } end := time.Now().UnixNano() delta := end - begin log.Infof("SaveSvrDataShutDown: begin[%dns] end[%dns], spend[%dms %dns]", begin, end, delta/NS2MS, delta%NS2MS) } func loadSvrData(key uint32) error { MutexSvrData.Lock() defer MutexSvrData.Unlock() G_SvrData = NewSvrData(db_name, key) if G_SvrData.IsLoad() { log.Infof("神奇的已加载数据 SvrData") return nil } var hasKey int var err error hasKey, err = G_SvrData.HasKey() switch hasKey { case 1: err = G_SvrData.Load() if err == nil { initValueSvrDataOnLoad(key) } case 0: // new err := initValueSvrData(key) if err != nil { log.Error("initValueSvrData %v data error: %v", key, err) return ERR_INIT_USER_DATA } case -1: return err default: log.Error("loadSvrData HasKey key[%v] hasKey[%d] error: %v", key, hasKey, err) return errors.New(fmt.Sprintf("error haskey[%d]", hasKey)) } return nil } func initValueSvrData(key uint32) error { initValueSvrDataOnLoad(key) return nil } func initValueSvrDataOnLoad(key uint32) { bChange := false data := G_SvrData.GetData(false) if data.LstChat == nil { bChange = true data.LstChat = []*v1.PbMsgOne{} } // if data.MapReportData == nil { // bChange = true // data.MapReportData = map[string]*v1.PbReportData{} // } if bChange { G_SvrData.GetData(true) } } func getSaveDataSvrData(temp *map[string]interface{}) error { MutexSvrData.Lock() defer MutexSvrData.Unlock() var err error *temp, err = G_SvrData.DirtyData() return err } func saveDataSvrData(temp *map[string]interface{}) error { MutexSvrData.RLock() defer MutexSvrData.RUnlock() var err error err = G_SvrData.Save2(*temp) return err } func saveDataSvrData2() error { MutexSvrData.Lock() defer MutexSvrData.Unlock() var err error err = G_SvrData.Save() return err } func AddChat(req *v1.AddChatReq) { MutexSvrData.Lock() defer MutexSvrData.Unlock() lst := &G_SvrData.GetData(true).LstChat *lst = append(*lst, &v1.PbMsgOne{ TimeStamp: time.Now().UnixNano(), Uuid: req.Uuid, Name: "", Msg: req.Msg, }) lstNum := len(*lst) if lstNum > 100 { *lst = (*lst)[lstNum-100:] } } func GetChat(timeStamp int64) []*v1.PbMsgOne { MutexSvrData.RLock() defer MutexSvrData.RUnlock() lst := G_SvrData.GetData(false).LstChat if timeStamp <= 0 { return lst } for k, v := range lst { if v.TimeStamp >= timeStamp { return lst[k:] } } return lst } func AddReportOne(key string, data *v1.PbReportData) { // MutexSvrData.Lock() // defer MutexSvrData.Unlock() // // now := uint32(time.Now().Unix()) // // svrData := G_SvrData.GetData(true) // lst := &svrData.MapReportData // // // 清理超时的 // if svrData.RfClearReportData+30*60 <= now { // svrData.RfClearReportData = now // // for k, v := range *lst { // if v.Rf+15*60*60 <= now { // 提现平台最后一次发送回调消息是14小时 // delete(*lst, k) // } // } // } // // (*lst)[key] = data } func GetReportOne(key string) *v1.PbReportData { // MutexSvrData.Lock() // defer MutexSvrData.Unlock() // // lst := &G_SvrData.GetData(false).MapReportData // // if v, ok := (*lst)[key]; ok { // delete(*lst, key) // return v // } // return nil }