message_record.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package gate
  2. import (
  3. "bet24.com/log"
  4. "bet24.com/servers/common"
  5. "sync"
  6. "time"
  7. )
  8. const (
  9. max_record = 100
  10. max_idle = 1800 // 半小时不发指令就删除
  11. )
  12. type messageData struct {
  13. data string
  14. t int64
  15. }
  16. type userRecord struct {
  17. msgList []messageData
  18. ping int64
  19. }
  20. func newUserRecord() *userRecord {
  21. ret := new(userRecord)
  22. return ret
  23. }
  24. func (ur *userRecord) addRecord(msg string) {
  25. count := len(ur.msgList)
  26. if count >= max_record {
  27. ur.msgList = ur.msgList[(count - max_record + 1):]
  28. }
  29. ur.msgList = append(ur.msgList, messageData{data: msg, t: time.Now().UnixNano() / 1000000})
  30. ur.ping = time.Now().Unix()
  31. }
  32. func (ur *userRecord) isTimeout() bool {
  33. return time.Now().Unix()-ur.ping >= max_idle
  34. }
  35. type messageRecord struct {
  36. lock *sync.RWMutex
  37. userList map[int]*userRecord
  38. }
  39. func newMessageRecord() *messageRecord {
  40. ret := new(messageRecord)
  41. ret.lock = &sync.RWMutex{}
  42. ret.userList = make(map[int]*userRecord)
  43. ret.checkClear()
  44. return ret
  45. }
  46. func (mr *messageRecord) clear(userId int) {
  47. mr.lock.Lock()
  48. if userId <= 0 {
  49. mr.userList = make(map[int]*userRecord)
  50. } else {
  51. delete(mr.userList, userId)
  52. }
  53. mr.lock.Unlock()
  54. }
  55. func (mr *messageRecord) addRecord(userId int, msg string) {
  56. mr.lock.Lock()
  57. defer mr.lock.Unlock()
  58. userRecord, ok := mr.userList[userId]
  59. if !ok {
  60. userRecord = newUserRecord()
  61. mr.userList[userId] = userRecord
  62. }
  63. userRecord.addRecord(msg)
  64. }
  65. func (mr *messageRecord) dump(userId int) {
  66. mr.lock.RLock()
  67. ur, ok := mr.userList[userId]
  68. mr.lock.RUnlock()
  69. if !ok {
  70. log.Release("message record for userId[%d] not exist", userId)
  71. return
  72. }
  73. log.Release("message record for userId[%d] len = %d idle = %d", userId, len(ur.msgList), time.Now().Unix()-ur.ping)
  74. for _, v := range ur.msgList {
  75. log.Release(" [%s:%d] %s", common.TimeStampToString(v.t/1000), v.t%1000, v.data)
  76. }
  77. log.Release("-----------------------------")
  78. }
  79. func (mr *messageRecord) checkClear() {
  80. time.AfterFunc(600*time.Second, mr.checkClear)
  81. var toRemove []int
  82. mr.lock.RLock()
  83. for k, v := range mr.userList {
  84. if v.isTimeout() {
  85. toRemove = append(toRemove, k)
  86. }
  87. }
  88. mr.lock.RUnlock()
  89. if len(toRemove) == 0 {
  90. return
  91. }
  92. mr.lock.Lock()
  93. for _, v := range toRemove {
  94. delete(mr.userList, v)
  95. }
  96. mr.lock.Unlock()
  97. }