redis.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package dao
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "strconv"
  7. "time"
  8. model "go-common/app/interface/main/credit/model"
  9. "go-common/library/cache/redis"
  10. "go-common/library/log"
  11. "github.com/pkg/errors"
  12. )
  13. const (
  14. _caseObtainMIDIdx = "c_o_v2_%d"
  15. _caseVoteCIDMIDIdx = "c_v_c_m_v2_%d_%s"
  16. _grantCaseKey = "gr_ca_li_v2"
  17. )
  18. func caseObtainMIDKey(mid int64) string {
  19. return fmt.Sprintf(_caseObtainMIDIdx, mid)
  20. }
  21. func caseVoteCIDMIDKey(mid int64) string {
  22. return fmt.Sprintf(_caseVoteCIDMIDIdx, mid, time.Now().Format("2006_01_02"))
  23. }
  24. // CaseObtainMID get voted cids by MID.
  25. func (d *Dao) CaseObtainMID(c context.Context, mid int64, isToday bool) (cases map[int64]*model.SimCase, err error) {
  26. conn := d.redis.Get(c)
  27. defer conn.Close()
  28. var _setKey string
  29. if isToday {
  30. _setKey = caseVoteCIDMIDKey(mid)
  31. } else {
  32. _setKey = caseObtainMIDKey(mid)
  33. }
  34. var ms []string
  35. if ms, err = redis.Strings(conn.Do("SMEMBERS", _setKey)); err != nil {
  36. if err != redis.ErrNil {
  37. return
  38. }
  39. err = nil
  40. }
  41. cases = make(map[int64]*model.SimCase)
  42. for _, s := range ms {
  43. if s == "" {
  44. continue
  45. }
  46. sc := &model.SimCase{}
  47. if err = json.Unmarshal([]byte(s), sc); err != nil {
  48. err = errors.WithStack(err)
  49. return
  50. }
  51. cases[sc.ID] = sc
  52. }
  53. return
  54. }
  55. // IsExpiredObtainMID voted cids by MID of key is expired.
  56. func (d *Dao) IsExpiredObtainMID(c context.Context, mid int64, isToday bool) (ok bool, err error) {
  57. conn := d.redis.Get(c)
  58. defer conn.Close()
  59. var _setKey string
  60. if isToday {
  61. _setKey = caseVoteCIDMIDKey(mid)
  62. } else {
  63. _setKey = caseObtainMIDKey(mid)
  64. }
  65. ok, err = redis.Bool(conn.Do("EXPIRE", _setKey, d.redisExpire))
  66. return
  67. }
  68. // GrantCases get granting case cids.
  69. func (d *Dao) GrantCases(c context.Context) (mcases map[int64]*model.SimCase, err error) {
  70. conn := d.redis.Get(c)
  71. defer conn.Close()
  72. var ms map[string]string
  73. if ms, err = redis.StringMap(conn.Do("HGETALL", _grantCaseKey)); err != nil {
  74. if err != redis.ErrNil {
  75. return
  76. }
  77. err = nil
  78. }
  79. mcases = make(map[int64]*model.SimCase)
  80. for m, s := range ms {
  81. if s == "" {
  82. continue
  83. }
  84. cid, err := strconv.ParseInt(m, 10, 64)
  85. if err != nil {
  86. log.Error("strconv.ParseInt(%s) error(%v)", m, err)
  87. err = nil
  88. continue
  89. }
  90. cc := &model.SimCase{}
  91. if err = json.Unmarshal([]byte(s), cc); err != nil {
  92. log.Error("json.Unmarshal(%s) error(%v)", s, err)
  93. err = nil
  94. continue
  95. }
  96. mcases[cid] = cc
  97. }
  98. return
  99. }
  100. // LoadVoteCaseMID load mid vote cases.
  101. func (d *Dao) LoadVoteCaseMID(c context.Context, mid int64, mcases map[int64]*model.SimCase, isToday bool) (err error) {
  102. conn := d.redis.Get(c)
  103. defer conn.Close()
  104. var _setKey string
  105. if isToday {
  106. _setKey = caseVoteCIDMIDKey(mid)
  107. } else {
  108. _setKey = caseObtainMIDKey(mid)
  109. }
  110. args := redis.Args{}.Add(_setKey)
  111. for _, mcase := range mcases {
  112. var mcStr []byte
  113. if mcStr, err = json.Marshal(mcase); err != nil {
  114. err = errors.WithStack(err)
  115. return
  116. }
  117. args = args.Add(string(mcStr))
  118. }
  119. if err = conn.Send("SADD", args...); err != nil {
  120. return
  121. }
  122. if err = conn.Send("EXPIRE", _setKey, d.redisExpire); err != nil {
  123. return
  124. }
  125. if err = conn.Flush(); err != nil {
  126. return
  127. }
  128. for i := 0; i < 2; i++ {
  129. _, err = conn.Receive()
  130. }
  131. return
  132. }
  133. // SetVoteCaseMID set vote case by mid on today.
  134. func (d *Dao) SetVoteCaseMID(c context.Context, mid int64, sc *model.SimCase) (err error) {
  135. conn := d.redis.Get(c)
  136. defer conn.Close()
  137. var scStr []byte
  138. if scStr, err = json.Marshal(sc); err != nil {
  139. err = errors.WithStack(err)
  140. return
  141. }
  142. if err = conn.Send("SADD", caseObtainMIDKey(mid), string(scStr)); err != nil {
  143. return
  144. }
  145. if err = conn.Send("SADD", caseVoteCIDMIDKey(mid), string(scStr)); err != nil {
  146. return
  147. }
  148. if err = conn.Send("EXPIRE", caseObtainMIDKey(mid), d.redisExpire); err != nil {
  149. return
  150. }
  151. if err = conn.Send("EXPIRE", caseVoteCIDMIDKey(mid), d.redisExpire); err != nil {
  152. return
  153. }
  154. if err = conn.Flush(); err != nil {
  155. return
  156. }
  157. for i := 0; i < 4; i++ {
  158. _, err = conn.Receive()
  159. }
  160. return
  161. }