mc_level.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package dao
  2. import (
  3. "context"
  4. "fmt"
  5. "go-common/app/service/live/userexp/model"
  6. mc "go-common/library/cache/memcache"
  7. "go-common/library/log"
  8. )
  9. const (
  10. _expKey = "level:%d"
  11. )
  12. func key(uid int64) string {
  13. return fmt.Sprintf(_expKey, uid)
  14. }
  15. // LevelCache 获取等级缓存
  16. func (d *Dao) LevelCache(c context.Context, uid int64) (level *model.Level, err error) {
  17. key := key(uid)
  18. conn := d.expMc.Get(c)
  19. defer conn.Close()
  20. r, err := conn.Get(key)
  21. if err != nil {
  22. if err == mc.ErrNotFound {
  23. err = nil
  24. return
  25. }
  26. log.Error("[dao.mc_exp|LevelCache] conn.Get(%s) error(%v)", key, err)
  27. return
  28. }
  29. level = &model.Level{}
  30. if err = conn.Scan(r, level); err != nil {
  31. log.Error("[dao.mc_exp|LevelCache] conn.Scan(%s) error(%v)", string(r.Value), err)
  32. }
  33. return
  34. }
  35. // SetLevelCache 设置等级缓存
  36. func (d *Dao) SetLevelCache(c context.Context, level *model.Level) (err error) {
  37. key := key(level.Uid)
  38. conn := d.expMc.Get(c)
  39. defer conn.Close()
  40. if conn.Set(&mc.Item{
  41. Key: key,
  42. Object: level,
  43. Flags: mc.FlagProtobuf,
  44. Expiration: d.cacheExpire,
  45. }); err != nil {
  46. log.Error("[dao.mc_exp|SetLevelCache] conn.Set(%s, %v) error(%v)", key, level, err)
  47. }
  48. return
  49. }
  50. // DelLevelCache 删除等级缓存
  51. func (d *Dao) DelLevelCache(c context.Context, uid int64) (err error) {
  52. key := key(uid)
  53. conn := d.expMc.Get(c)
  54. defer conn.Close()
  55. if err = conn.Delete(key); err == mc.ErrNotFound {
  56. err = nil
  57. } else if err != nil {
  58. log.Error("[dao.mc_exp|DelLevelCache] conn.Delete(%s) error(%v)", key, err)
  59. }
  60. return
  61. }
  62. // MultiLevelCache 批量获取等级缓存
  63. func (d *Dao) MultiLevelCache(c context.Context, uids []int64) (level []*model.Level, missed []int64, err error) {
  64. var keys []string
  65. var um = make(map[int64]struct{}, len(uids))
  66. for _, uid := range uids {
  67. keys = append(keys, key(uid))
  68. um[uid] = struct{}{}
  69. }
  70. conn := d.expMc.Get(c)
  71. defer conn.Close()
  72. r, err := conn.GetMulti(keys)
  73. if err != nil {
  74. log.Error("[dao.mc_exp|MultiLevelCache] conn.GetMulti error(%v)", err)
  75. return
  76. }
  77. // 命中列表
  78. for _, v := range r {
  79. ele := &model.Level{}
  80. if err = conn.Scan(v, ele); err != nil {
  81. log.Error("[dao.mc_exp|MultiLevelCache] conn.Scan error(%v)", err)
  82. return
  83. }
  84. level = append(level, ele)
  85. delete(um, ele.Uid)
  86. }
  87. // MISS列表
  88. if len(level) != 0 {
  89. for uid := range um {
  90. missed = append(missed, uid)
  91. }
  92. } else {
  93. missed = uids
  94. }
  95. return
  96. }