transfercount.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package handler
  2. import (
  3. "bet24.com/log"
  4. "bet24.com/redis"
  5. "encoding/json"
  6. "sync"
  7. "time"
  8. )
  9. const redis_key = "money_transfercount"
  10. var transferCountMgr *transferCountManager
  11. type transferCountManager struct {
  12. lockUser *sync.RWMutex
  13. UserTransferCount map[int]int
  14. LastDay int
  15. isDirty bool
  16. }
  17. func getTransferCountMgr() *transferCountManager {
  18. if transferCountMgr == nil {
  19. transferCountMgr = new(transferCountManager)
  20. transferCountMgr.ctor()
  21. }
  22. return transferCountMgr
  23. }
  24. func (tcm *transferCountManager) ctor() {
  25. tcm.lockUser = &sync.RWMutex{}
  26. tcm.UserTransferCount = make(map[int]int)
  27. tcm.LastDay = time.Now().Day()
  28. tcm.loadTransferCountInfo()
  29. time.AfterFunc(10*time.Minute, tcm.saveTransferCountInfo)
  30. }
  31. func (tcm *transferCountManager) checkDayChanged() {
  32. nowDay := time.Now().Day()
  33. if nowDay == tcm.LastDay {
  34. return
  35. }
  36. tcm.isDirty = true
  37. tcm.LastDay = nowDay
  38. tcm.lockUser.Lock()
  39. tcm.UserTransferCount = make(map[int]int)
  40. tcm.lockUser.Unlock()
  41. }
  42. func (tcm *transferCountManager) getTransferCount(userId int) int {
  43. tcm.checkDayChanged()
  44. tcm.lockUser.RLock()
  45. defer tcm.lockUser.RUnlock()
  46. count, ok := tcm.UserTransferCount[userId]
  47. if !ok {
  48. return 0
  49. }
  50. return count
  51. }
  52. func (tcm *transferCountManager) addTransferCount(userId int) {
  53. tcm.lockUser.Lock()
  54. tcm.UserTransferCount[userId] += 1
  55. tcm.lockUser.Unlock()
  56. tcm.isDirty = true
  57. }
  58. func (tcm *transferCountManager) loadTransferCountInfo() {
  59. data, ok := redis.String_Get(redis_key)
  60. if data == "" || !ok {
  61. return
  62. }
  63. err := json.Unmarshal([]byte(data), &tcm)
  64. if err != nil {
  65. log.Release("transferCountManager.loadTransferCountInfo Unmarshal faied %s", data)
  66. return
  67. }
  68. tcm.checkDayChanged()
  69. }
  70. func (tcm *transferCountManager) saveTransferCountInfo() {
  71. time.AfterFunc(10*time.Minute, tcm.saveTransferCountInfo)
  72. if !tcm.isDirty {
  73. return
  74. }
  75. d, _ := json.Marshal(tcm)
  76. redis.String_SetEx(redis_key, string(d), 86400)
  77. }
  78. func (tcm *transferCountManager) dump(param string) {
  79. log.Release("-------------------------------")
  80. log.Release("transferCountManager.dump %s", param)
  81. defer func() {
  82. log.Release("+++++++++++++++++++++++++++++++")
  83. log.Release("")
  84. }()
  85. d, _ := json.Marshal(tcm)
  86. log.Release(string(d))
  87. }