save
This commit is contained in:
parent
c834b49870
commit
6809de4a6d
@ -34,6 +34,19 @@ type Player struct {
|
|||||||
ReadMailHash map[int64]*ReadMail
|
ReadMailHash map[int64]*ReadMail
|
||||||
DeletedMailHash map[int64]*DeletedMail
|
DeletedMailHash map[int64]*DeletedMail
|
||||||
CacheExpiration time.Time
|
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 {
|
func (p *Player) GetAccountId() string {
|
||||||
@ -96,7 +109,7 @@ func (p *Player) DeleteMails(mailIds string) {
|
|||||||
p.MarkDirty()
|
p.MarkDirty()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Player) AddToReadList(mailIds string) {}
|
func (p *Player) AddToReadList() {}
|
||||||
|
|
||||||
func (p *Player) GetAttachment(mailIds string) []interface{} {
|
func (p *Player) GetAttachment(mailIds string) []interface{} {
|
||||||
attachments := make([]interface{}, 0)
|
attachments := make([]interface{}, 0)
|
||||||
@ -160,9 +173,9 @@ func (p *Player) Deserialize(accountPB *ss.MFAccountData) {
|
|||||||
|
|
||||||
func (p *Player) Serialize(accountPB *ss.MFAccountData) {
|
func (p *Player) Serialize(accountPB *ss.MFAccountData) {
|
||||||
var nextDaySec int32 = 3600 * 24
|
var nextDaySec int32 = 3600 * 24
|
||||||
nowUnixSec := time.Now().Unix()
|
nowUnixSec := int32(time.Now().Unix())
|
||||||
for _, readMail := range p.ReadMailHash {
|
for _, readMail := range p.ReadMailHash {
|
||||||
if int64(readMail.expireTime+nextDaySec) > nowUnixSec {
|
if readMail.expireTime+nextDaySec > nowUnixSec {
|
||||||
p2 := &ss.MFReadMail{
|
p2 := &ss.MFReadMail{
|
||||||
MailId: &readMail.mailId,
|
MailId: &readMail.mailId,
|
||||||
ReadTime: &readMail.readTime,
|
ReadTime: &readMail.readTime,
|
||||||
@ -173,7 +186,7 @@ func (p *Player) Serialize(accountPB *ss.MFAccountData) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, deletedMail := range p.DeletedMailHash {
|
for _, deletedMail := range p.DeletedMailHash {
|
||||||
if int64(deletedMail.expireTime+nextDaySec) > nowUnixSec {
|
if deletedMail.expireTime+nextDaySec > nowUnixSec {
|
||||||
p3 := &ss.MFDeletedMail{
|
p3 := &ss.MFDeletedMail{
|
||||||
MailId: &deletedMail.mailId,
|
MailId: &deletedMail.mailId,
|
||||||
DeleteTime: &deletedMail.deleteTime,
|
DeleteTime: &deletedMail.deleteTime,
|
||||||
@ -188,19 +201,49 @@ func (p *Player) UpdateExpire() {
|
|||||||
p.CacheExpiration = time.Now().Add(20 * time.Second)
|
p.CacheExpiration = time.Now().Add(20 * time.Second)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *Player) IsCacheNotExpired() bool {
|
||||||
|
return time.Now().Before(p.CacheExpiration)
|
||||||
|
}
|
||||||
|
|
||||||
func (p *Player) IsCacheExpired() bool {
|
func (p *Player) IsCacheExpired() bool {
|
||||||
return time.Now().After(p.CacheExpiration)
|
return time.Now().After(p.CacheExpiration)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Player) SaveToDB() {
|
func (p *Player) MarkDirty() {
|
||||||
|
// f5.GetApp().RegisterMainThreadCb(func() {})
|
||||||
p.Lock()
|
p.Lock()
|
||||||
defer p.Unlock()
|
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{}
|
accountPB := ss.MFAccountData{}
|
||||||
p.Serialize(&accountPB)
|
p.Serialize(&accountPB)
|
||||||
blobData, err := proto.Marshal(&accountPB)
|
blobData, err := proto.Marshal(&accountPB)
|
||||||
if err != nil {
|
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
|
return
|
||||||
}
|
}
|
||||||
blobDataStr := string(blobData)
|
blobDataStr := string(blobData)
|
||||||
@ -213,34 +256,8 @@ func (p *Player) SaveToDB() {
|
|||||||
sql,
|
sql,
|
||||||
func(err error, rows *f5.DataSet) {
|
func(err error, rows *f5.DataSet) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
f5.GetSysLog().Info("SaveToDB Error:%v\n", err)
|
f5.GetSysLog().Info("SaveToDB Error:%v accountId:%s\n", err, p.GetAccountId())
|
||||||
} else {
|
|
||||||
// 标记p 为已过期
|
|
||||||
p.CacheExpiration = time.Now().Add(-10 * time.Second)
|
|
||||||
f5.GetSysLog().Info("SaveToDB OK\n")
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
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),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -28,8 +28,7 @@ func (pm *PlayerMgr) GetPlayer(accountId string) *Player {
|
|||||||
|
|
||||||
func (pm *PlayerMgr) AsyncGetPlayer(accountId string) *Player {
|
func (pm *PlayerMgr) AsyncGetPlayer(accountId string) *Player {
|
||||||
p := pm.GetPlayer(accountId)
|
p := pm.GetPlayer(accountId)
|
||||||
if p != nil && !p.IsCacheExpired() {
|
if p != nil && p.IsCacheNotExpired() {
|
||||||
// f5.GetSysLog().Info("GetPlayer(%s) from cache", accountId)
|
|
||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -47,5 +46,6 @@ func (pm *PlayerMgr) AsyncGetPlayer(accountId string) *Player {
|
|||||||
})
|
})
|
||||||
}(accountId)
|
}(accountId)
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
|
|
||||||
return player
|
return player
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user