memcache.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. package medal
  2. import (
  3. "context"
  4. "strconv"
  5. "github.com/pkg/errors"
  6. "go-common/app/service/main/usersuit/model"
  7. gmc "go-common/library/cache/memcache"
  8. "go-common/library/log"
  9. )
  10. const (
  11. _prefixActivatedNid = "usma:" // key of activated medal nid
  12. _prefixOwners = "umos:" // key of owners info
  13. _prefixRedPoint = "usrp:" // key of red point
  14. _prefixPopup = "uspp:" // key of new medal popup
  15. )
  16. // medalactivated medal nid key.
  17. func activatedNidKey(mid int64) string {
  18. return _prefixActivatedNid + strconv.FormatInt(mid, 10)
  19. }
  20. // ownersKey medal_owner key.
  21. func ownersKey(mid int64) string {
  22. return _prefixOwners + strconv.FormatInt(mid, 10)
  23. }
  24. //RedPointKey new medal RedPoint key.
  25. func RedPointKey(mid int64) string {
  26. return _prefixRedPoint + strconv.FormatInt(mid, 10)
  27. }
  28. // PopupKey new medal popup key.
  29. func PopupKey(mid int64) string {
  30. return _prefixPopup + strconv.FormatInt(mid, 10)
  31. }
  32. func (d *Dao) pingMC(c context.Context) (err error) {
  33. conn := d.mc.Get(c)
  34. defer conn.Close()
  35. if err = conn.Set(&gmc.Item{Key: "ping", Value: []byte{1}, Expiration: d.mcExpire}); err != nil {
  36. err = errors.WithStack(err)
  37. }
  38. return
  39. }
  40. // MedalOwnersCache get medal_owner cache.
  41. func (d *Dao) MedalOwnersCache(c context.Context, mid int64) (res []*model.MedalOwner, notFound bool, err error) {
  42. conn := d.mc.Get(c)
  43. defer conn.Close()
  44. item, err := conn.Get(ownersKey(mid))
  45. if err != nil {
  46. if err == gmc.ErrNotFound {
  47. res = nil
  48. err = nil
  49. notFound = true
  50. return
  51. }
  52. err = errors.WithStack(err)
  53. return
  54. }
  55. res = make([]*model.MedalOwner, 0)
  56. if err = conn.Scan(item, &res); err != nil {
  57. err = errors.WithStack(err)
  58. }
  59. return
  60. }
  61. // SetMedalOwnersache set medal_owner cache.
  62. func (d *Dao) SetMedalOwnersache(c context.Context, mid int64, nos []*model.MedalOwner) (err error) {
  63. key := ownersKey(mid)
  64. item := &gmc.Item{Key: key, Object: nos, Expiration: d.mcExpire, Flags: gmc.FlagJSON}
  65. conn := d.mc.Get(c)
  66. defer conn.Close()
  67. if err = conn.Set(item); err != nil {
  68. err = errors.WithStack(err)
  69. }
  70. return
  71. }
  72. // DelMedalOwnersCache delete medal_owner cache.
  73. func (d *Dao) DelMedalOwnersCache(c context.Context, mid int64) (err error) {
  74. key := ownersKey(mid)
  75. conn := d.mc.Get(c)
  76. defer conn.Close()
  77. if err = conn.Delete(key); err != nil {
  78. if err == gmc.ErrNotFound {
  79. err = nil
  80. } else {
  81. err = errors.WithStack(err)
  82. }
  83. }
  84. return
  85. }
  86. // MedalsActivatedCache multi get user activated medal nid from memcache.
  87. func (d *Dao) medalsActivatedCache(c context.Context, mids []int64) (nids map[int64]int64, missed []int64, err error) {
  88. nids = make(map[int64]int64, len(mids))
  89. keys := make([]string, len(mids))
  90. mm := make(map[string]int64, len(mids))
  91. for i, mid := range mids {
  92. var key = activatedNidKey(mid)
  93. keys[i] = key
  94. mm[key] = mid
  95. }
  96. conn := d.mc.Get(c)
  97. defer conn.Close()
  98. items, err := conn.GetMulti(keys)
  99. if err != nil {
  100. if err == gmc.ErrNotFound {
  101. err = nil
  102. }
  103. return
  104. }
  105. for _, item := range items {
  106. var nid int64
  107. if err = conn.Scan(item, &nid); err != nil {
  108. log.Error("conn.Scan(%s) error(%v)", item.Value, err)
  109. continue
  110. }
  111. nids[mm[item.Key]] = nid
  112. delete(mm, item.Key)
  113. }
  114. missed = make([]int64, 0, len(mm))
  115. for _, m := range mm {
  116. missed = append(missed, m)
  117. }
  118. return
  119. }
  120. // MedalActivatedCache get user activated medal nid.
  121. func (d *Dao) medalActivatedCache(c context.Context, mid int64) (nid int64, notFound bool, err error) {
  122. conn := d.mc.Get(c)
  123. defer conn.Close()
  124. item, err := conn.Get(activatedNidKey(mid))
  125. if err != nil {
  126. if err == gmc.ErrNotFound {
  127. nid = 0
  128. err = nil
  129. notFound = true
  130. return
  131. }
  132. err = errors.WithStack(err)
  133. return
  134. }
  135. if err = conn.Scan(item, &nid); err != nil {
  136. err = errors.WithStack(err)
  137. }
  138. return
  139. }
  140. // SetMedalActivatedCache set activated medal cache.
  141. func (d *Dao) SetMedalActivatedCache(c context.Context, mid, nid int64) (err error) {
  142. key := activatedNidKey(mid)
  143. item := &gmc.Item{Key: key, Object: nid, Expiration: d.mcExpire, Flags: gmc.FlagJSON}
  144. conn := d.mc.Get(c)
  145. defer conn.Close()
  146. if err = conn.Set(item); err != nil {
  147. err = errors.WithStack(err)
  148. }
  149. return
  150. }
  151. // DelMedalActivatedCache delete activated medal cache.
  152. func (d *Dao) DelMedalActivatedCache(c context.Context, mid int64) (err error) {
  153. key := activatedNidKey(mid)
  154. conn := d.mc.Get(c)
  155. defer conn.Close()
  156. if err = conn.Delete(key); err != nil {
  157. if err == gmc.ErrNotFound {
  158. err = nil
  159. } else {
  160. err = errors.WithStack(err)
  161. }
  162. }
  163. return
  164. }
  165. // PopupCache get new medal info popup cache.
  166. func (d *Dao) PopupCache(c context.Context, mid int64) (nid int64, err error) {
  167. conn := d.mc.Get(c)
  168. defer conn.Close()
  169. item, err := conn.Get(PopupKey(mid))
  170. if err != nil {
  171. if err == gmc.ErrNotFound {
  172. nid = 0
  173. err = nil
  174. return
  175. }
  176. err = errors.WithStack(err)
  177. return
  178. }
  179. if err = conn.Scan(item, &nid); err != nil {
  180. err = errors.WithStack(err)
  181. }
  182. return
  183. }
  184. // SetPopupCache set popup cache.
  185. func (d *Dao) SetPopupCache(c context.Context, mid, nid int64) (err error) {
  186. key := PopupKey(mid)
  187. item := &gmc.Item{Key: key, Object: nid, Expiration: d.pointExpire, Flags: gmc.FlagJSON}
  188. conn := d.mc.Get(c)
  189. defer conn.Close()
  190. if err = conn.Set(item); err != nil {
  191. err = errors.WithStack(err)
  192. }
  193. return
  194. }
  195. // DelPopupCache delete new medal info popup cache.
  196. func (d *Dao) DelPopupCache(c context.Context, mid int64) (err error) {
  197. key := PopupKey(mid)
  198. conn := d.mc.Get(c)
  199. defer conn.Close()
  200. if err = conn.Delete(key); err != nil {
  201. if err == gmc.ErrNotFound {
  202. err = nil
  203. } else {
  204. err = errors.WithStack(err)
  205. }
  206. }
  207. return
  208. }
  209. // RedPointCache get new medal info red point cache.
  210. func (d *Dao) RedPointCache(c context.Context, mid int64) (nid int64, err error) {
  211. conn := d.mc.Get(c)
  212. defer conn.Close()
  213. item, err := conn.Get(RedPointKey(mid))
  214. if err != nil {
  215. if err == gmc.ErrNotFound {
  216. err = nil
  217. return
  218. }
  219. err = errors.WithStack(err)
  220. return
  221. }
  222. if err = conn.Scan(item, &nid); err != nil {
  223. err = errors.WithStack(err)
  224. }
  225. return
  226. }
  227. // SetRedPointCache set red point cache.
  228. func (d *Dao) SetRedPointCache(c context.Context, mid, nid int64) (err error) {
  229. key := RedPointKey(mid)
  230. item := &gmc.Item{Key: key, Object: nid, Expiration: d.pointExpire, Flags: gmc.FlagJSON}
  231. conn := d.mc.Get(c)
  232. defer conn.Close()
  233. if err = conn.Set(item); err != nil {
  234. err = errors.WithStack(err)
  235. }
  236. return
  237. }
  238. // DelRedPointCache delete new medal info red point cache.
  239. func (d *Dao) DelRedPointCache(c context.Context, mid int64) (err error) {
  240. key := RedPointKey(mid)
  241. conn := d.mc.Get(c)
  242. defer conn.Close()
  243. if err = conn.Delete(key); err != nil {
  244. if err == gmc.ErrNotFound {
  245. err = nil
  246. } else {
  247. err = errors.WithStack(err)
  248. }
  249. }
  250. return
  251. }