memcache.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package archive
  2. import (
  3. "context"
  4. "strconv"
  5. "go-common/app/interface/main/tv/model/view"
  6. arcwar "go-common/app/service/main/archive/api"
  7. "go-common/library/cache/memcache"
  8. "go-common/library/log"
  9. "github.com/pkg/errors"
  10. )
  11. const (
  12. _prefixRelate = "al_"
  13. _prefixViewStatic = "avp_"
  14. _prefixArchive = "a3p_"
  15. )
  16. func keyRl(aid int64) string {
  17. return _prefixRelate + strconv.FormatInt(aid, 10)
  18. }
  19. func keyView(aid int64) string {
  20. return _prefixViewStatic + strconv.FormatInt(aid, 10)
  21. }
  22. func keyArc(aid int64) string {
  23. return _prefixArchive + strconv.FormatInt(aid, 10)
  24. }
  25. // AddArcCache add arc cache
  26. func (d *Dao) AddArcCache(aid int64, arc *arcwar.Arc) {
  27. d.addCache(func() {
  28. d.addArcCache(context.TODO(), aid, arc)
  29. })
  30. }
  31. // AddRelatesCache add relates
  32. func (d *Dao) AddRelatesCache(aid int64, rls []*view.Relate) {
  33. d.addCache(func() {
  34. d.addRelatesCache(context.TODO(), aid, rls)
  35. })
  36. }
  37. // AddViewCache add view relates
  38. func (d *Dao) AddViewCache(aid int64, vp *arcwar.ViewReply) {
  39. d.addCache(func() {
  40. d.addViewCache(context.TODO(), aid, vp)
  41. })
  42. }
  43. // addViewCache add relates cache.
  44. func (d *Dao) addViewCache(c context.Context, aid int64, vp *arcwar.ViewReply) (err error) {
  45. conn := d.arcMc.Get(c)
  46. key := keyView(aid)
  47. item := &memcache.Item{Key: key, Object: vp, Flags: memcache.FlagJSON, Expiration: d.expireView}
  48. if err = conn.Set(item); err != nil {
  49. err = errors.Wrapf(err, "conn.Set(%s,%v,%d)", key, vp, d.expireView)
  50. }
  51. conn.Close()
  52. return
  53. }
  54. // RelatesCache get relates.
  55. func (d *Dao) RelatesCache(c context.Context, aid int64) (rls []*view.Relate, err error) {
  56. conn := d.arcMc.Get(c)
  57. key := keyRl(aid)
  58. defer conn.Close()
  59. r, err := conn.Get(key)
  60. if err != nil {
  61. if err == memcache.ErrNotFound {
  62. err = nil
  63. return
  64. }
  65. err = errors.Wrapf(err, "conn.Get(%s)", key)
  66. return
  67. }
  68. if err = conn.Scan(r, &rls); err != nil {
  69. err = errors.Wrapf(err, "conn.Scan(%s)", r.Value)
  70. }
  71. return
  72. }
  73. // addRelatesCache add relates cache.
  74. func (d *Dao) addRelatesCache(c context.Context, aid int64, rls []*view.Relate) (err error) {
  75. conn := d.arcMc.Get(c)
  76. key := keyRl(aid)
  77. item := &memcache.Item{Key: key, Object: rls, Flags: memcache.FlagJSON, Expiration: d.expireRlt}
  78. if err = conn.Set(item); err != nil {
  79. err = errors.Wrapf(err, "conn.Set(%s,%v,%d)", key, rls, d.expireRlt)
  80. }
  81. conn.Close()
  82. return
  83. }
  84. // addRelatesCache add relates cache.
  85. func (d *Dao) addArcCache(c context.Context, aid int64, cached *arcwar.Arc) (err error) {
  86. conn := d.arcMc.Get(c)
  87. key := keyArc(aid)
  88. item := &memcache.Item{Key: key, Object: cached, Flags: memcache.FlagJSON, Expiration: d.expireArc}
  89. if err = conn.Set(item); err != nil {
  90. err = errors.Wrapf(err, "conn.Set(%s,%v,%d)", key, cached, d.expireArc)
  91. }
  92. conn.Close()
  93. return
  94. }
  95. // arcsCache get archives cache.
  96. func (d *Dao) arcsCache(c context.Context, aids []int64) (cached map[int64]*arcwar.Arc, missed []int64, err error) {
  97. cached = make(map[int64]*arcwar.Arc, len(aids))
  98. conn := d.arcMc.Get(c)
  99. defer conn.Close()
  100. keys := make([]string, 0, len(aids))
  101. aidmap := make(map[string]int64, len(aids))
  102. for _, aid := range aids {
  103. k := keyArc(aid)
  104. if _, ok := aidmap[k]; !ok {
  105. keys = append(keys, k)
  106. aidmap[k] = aid
  107. }
  108. }
  109. rs, err := conn.GetMulti(keys)
  110. if err != nil {
  111. err = errors.Wrapf(err, "conn.GetMulti(%v)", keys)
  112. return
  113. }
  114. for k, r := range rs {
  115. a := &arcwar.Arc{}
  116. if err = conn.Scan(r, a); err != nil {
  117. log.Error("conn.Scan(%s) error(%v)", r.Value, err)
  118. err = nil
  119. continue
  120. }
  121. cached[aidmap[k]] = a
  122. // delete hit key
  123. delete(aidmap, k)
  124. }
  125. // missed key
  126. missed = make([]int64, 0, len(aidmap))
  127. for _, aid := range aidmap {
  128. missed = append(missed, aid)
  129. }
  130. return
  131. }