dayaccumulation.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package gold2chipwheel
  2. import (
  3. "bet24.com/log"
  4. "bet24.com/redis"
  5. "encoding/json"
  6. "sync"
  7. "time"
  8. )
  9. type dayaccumulation struct {
  10. UpdateDay int
  11. // 每日累加
  12. Accumulation map[int]int
  13. lock *sync.RWMutex
  14. }
  15. func newDayAccumulation() *dayaccumulation {
  16. ret := new(dayaccumulation)
  17. ret.lock = &sync.RWMutex{}
  18. ret.Accumulation = make(map[int]int)
  19. ret.loadData()
  20. return ret
  21. }
  22. func (da *dayaccumulation) loadData() {
  23. data, ok := redis.String_Get(da.getRedisKey())
  24. if data == "" || !ok {
  25. return
  26. }
  27. da.lock.Lock()
  28. err := json.Unmarshal([]byte(data), &da)
  29. da.lock.Unlock()
  30. if err != nil {
  31. log.Release("dayaccumulation.loadData Unmarshal failed err:%v,%s", err, data)
  32. return
  33. }
  34. // 如果时间太长了
  35. if da.UpdateDay != time.Now().Day() {
  36. da.Accumulation = make(map[int]int)
  37. da.UpdateDay = time.Now().Day()
  38. }
  39. da.resetAccumulation()
  40. }
  41. func (da *dayaccumulation) flush() {
  42. da.lock.RLock()
  43. d, _ := json.Marshal(da)
  44. da.lock.RUnlock()
  45. go redis.String_Set(da.getRedisKey(), string(d))
  46. }
  47. func (da *dayaccumulation) getRedisKey() string {
  48. return "gold2chipwheel:accumulation"
  49. }
  50. func (da *dayaccumulation) addAccumulate(userId int, amount int) {
  51. da.lock.Lock()
  52. da.Accumulation[userId] += amount
  53. da.lock.Unlock()
  54. }
  55. func (da *dayaccumulation) resetAccumulation() {
  56. time.AfterFunc(time.Hour, da.resetAccumulation)
  57. defer da.flush()
  58. now := time.Now()
  59. if now.Day() == da.UpdateDay {
  60. return
  61. }
  62. log.Debug("dayaccumulation resetAccumulation")
  63. da.UpdateDay = now.Day()
  64. da.lock.Lock()
  65. da.Accumulation = make(map[int]int)
  66. da.lock.Unlock()
  67. }
  68. func (da *dayaccumulation) getAccumulate(userId int) int {
  69. da.lock.RLock()
  70. defer da.lock.RUnlock()
  71. return da.Accumulation[userId]
  72. }