From 6809de4a6d0090051a6fc8489235715a81b57750 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AE=B7=E5=8B=87?= Date: Tue, 31 Oct 2023 16:50:03 +0800 Subject: [PATCH] save --- server/mailserver/player/player.go | 83 ++++++++++++++++----------- server/mailserver/player/playermgr.go | 4 +- 2 files changed, 52 insertions(+), 35 deletions(-) diff --git a/server/mailserver/player/player.go b/server/mailserver/player/player.go index 6eb5751a..1255cf4c 100644 --- a/server/mailserver/player/player.go +++ b/server/mailserver/player/player.go @@ -34,6 +34,19 @@ type Player struct { ReadMailHash map[int64]*ReadMail DeletedMailHash map[int64]*DeletedMail CacheExpiration time.Time + // 定时器 + dirtyTimer *f5.TimerWp + attacher *f5.TimerAttacher + dirty bool // 标记数据已修改 +} + +func NewPlayer(accountId string) *Player { + return &Player{ + AccountId: accountId, + ReadMailHash: make(map[int64]*ReadMail), + DeletedMailHash: make(map[int64]*DeletedMail), + CacheExpiration: time.Now().Add(20 * time.Second), + } } func (p *Player) GetAccountId() string { @@ -96,7 +109,7 @@ func (p *Player) DeleteMails(mailIds string) { p.MarkDirty() } -func (p *Player) AddToReadList(mailIds string) {} +func (p *Player) AddToReadList() {} func (p *Player) GetAttachment(mailIds string) []interface{} { attachments := make([]interface{}, 0) @@ -160,9 +173,9 @@ func (p *Player) Deserialize(accountPB *ss.MFAccountData) { func (p *Player) Serialize(accountPB *ss.MFAccountData) { var nextDaySec int32 = 3600 * 24 - nowUnixSec := time.Now().Unix() + nowUnixSec := int32(time.Now().Unix()) for _, readMail := range p.ReadMailHash { - if int64(readMail.expireTime+nextDaySec) > nowUnixSec { + if readMail.expireTime+nextDaySec > nowUnixSec { p2 := &ss.MFReadMail{ MailId: &readMail.mailId, ReadTime: &readMail.readTime, @@ -173,7 +186,7 @@ func (p *Player) Serialize(accountPB *ss.MFAccountData) { } for _, deletedMail := range p.DeletedMailHash { - if int64(deletedMail.expireTime+nextDaySec) > nowUnixSec { + if deletedMail.expireTime+nextDaySec > nowUnixSec { p3 := &ss.MFDeletedMail{ MailId: &deletedMail.mailId, DeleteTime: &deletedMail.deleteTime, @@ -188,19 +201,49 @@ func (p *Player) UpdateExpire() { p.CacheExpiration = time.Now().Add(20 * time.Second) } +func (p *Player) IsCacheNotExpired() bool { + return time.Now().Before(p.CacheExpiration) +} + func (p *Player) IsCacheExpired() bool { return time.Now().After(p.CacheExpiration) } -func (p *Player) SaveToDB() { +func (p *Player) MarkDirty() { + // f5.GetApp().RegisterMainThreadCb(func() {}) p.Lock() defer p.Unlock() + p.dirty = true // 标记数据已修改 + p.ScheduleSave() +} +func (p *Player) ScheduleSave() { + if p.dirtyTimer != nil { + return + } + + p.attacher = f5.GetTimer().NewTimerAttacher() + p.dirtyTimer = f5.GetTimer().SetTimeoutExWp( + 10000, + func(e int32, args *q5.Args) { + if e == q5.TIMER_EXEC_EVENT { + p.Lock() + defer p.Unlock() + if p.dirty { + p.SaveToDB() // Persistence, Save TO DB + p.dirty = false // 重置标志 + } + } + }, + p.attacher) +} + +func (p *Player) SaveToDB() { accountPB := ss.MFAccountData{} p.Serialize(&accountPB) blobData, err := proto.Marshal(&accountPB) if err != nil { - f5.GetSysLog().Info("SaveToDB proto.Marshal Error:%v \n", err) + f5.GetSysLog().Info("SaveToDB proto.Marshal Error:%v accountId:%s \n", err, p.GetAccountId()) return } blobDataStr := string(blobData) @@ -213,34 +256,8 @@ func (p *Player) SaveToDB() { sql, func(err error, rows *f5.DataSet) { if err != nil { - f5.GetSysLog().Info("SaveToDB Error:%v\n", err) - } else { - // 标记p 为已过期 - p.CacheExpiration = time.Now().Add(-10 * time.Second) - f5.GetSysLog().Info("SaveToDB OK\n") + f5.GetSysLog().Info("SaveToDB Error:%v accountId:%s\n", err, p.GetAccountId()) } }, ) } - -func (p *Player) MarkDirty() { - // f5.GetApp().RegisterMainThreadCb(func() {}) - timer := f5.GetTimer() - timer.SetTimeout( - 1000*10, - func(e int32, args *q5.Args) { - if e == q5.TIMER_EXEC_EVENT { - p.SaveToDB() - } - }, - ) -} - -func NewPlayer(accountId string) *Player { - return &Player{ - AccountId: accountId, - ReadMailHash: make(map[int64]*ReadMail), - DeletedMailHash: make(map[int64]*DeletedMail), - CacheExpiration: time.Now().Add(20 * time.Second), - } -} diff --git a/server/mailserver/player/playermgr.go b/server/mailserver/player/playermgr.go index 5627e7e9..1987faef 100644 --- a/server/mailserver/player/playermgr.go +++ b/server/mailserver/player/playermgr.go @@ -28,8 +28,7 @@ func (pm *PlayerMgr) GetPlayer(accountId string) *Player { func (pm *PlayerMgr) AsyncGetPlayer(accountId string) *Player { p := pm.GetPlayer(accountId) - if p != nil && !p.IsCacheExpired() { - // f5.GetSysLog().Info("GetPlayer(%s) from cache", accountId) + if p != nil && p.IsCacheNotExpired() { return p } @@ -47,5 +46,6 @@ func (pm *PlayerMgr) AsyncGetPlayer(accountId string) *Player { }) }(accountId) wg.Wait() + return player }