package global import ( "fmt" "github.com/idealeak/goserver/core/logger" "github.com/tomas-qstarrs/redimo" "mongo.games.com/game/gamesrv/slotspkg/internal/generic/ddb" "sync" "time" ) var GlobalMgrSington = &GlobalMgr{ globalUUID: make(map[string]uint64), } var rwMu sync.RWMutex const ( GLOBAL_PLAYERUUID = "GLOBAL:PLAYERUUID" ) type GlobalMgr struct { *redimo.Client globalUUID map[string]uint64 dirty bool } func (r *GlobalMgr) ModuleName() string { return "GlobalMgr" } func (r *GlobalMgr) getKey(key string) string { return fmt.Sprintf("%s:%s:%s", Project, Game, key) } func (r *GlobalMgr) Init() { r.Client = ddb.RedimoClient() key := r.getKey(GLOBAL_PLAYERUUID) val, err := r.GET(key) if err != nil { logger.Logger.Warnf("GlobalMgr Init err: %v", err) //这里表示表不存在,不影响后续执行 //return } oldUid := val.Int() if oldUid == 0 { r.globalUUID[key] = 1000000000 r.dirty = true } else { r.globalUUID[key] = uint64(oldUid) } } func (r *GlobalMgr) GetUUID() uint64 { rwMu.Lock() defer rwMu.Unlock() key := r.getKey(GLOBAL_PLAYERUUID) r.globalUUID[key]++ r.dirty = true newUid := r.globalUUID[key] _, err := r.SET(key, newUid) if err != nil { logger.Logger.Warnf("GlobalMgr GetUUID err: %v", err) } return newUid } func (r *GlobalMgr) saveUUID() { if r.dirty { r.dirty = false key := r.getKey(GLOBAL_PLAYERUUID) if oldUid, ok := r.globalUUID[key]; ok { _, err := r.SET(key, oldUid) if err != nil { r.dirty = true logger.Logger.Errorf("GlobalMgr SET redimoClient error: %v", err) } } } } func (r *GlobalMgr) Update() { //r.saveUUID() } func (r *GlobalMgr) Shutdown() { //logger.Logger.Infof("===== saveData ======== [%v] Shutdown", r.ModuleName()) //r.saveUUID() } func init() { module.RegisteModule(GlobalMgrSington, time.Hour, 0) }