redis_rct.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package dao
  2. import (
  3. "context"
  4. "strconv"
  5. "go-common/app/interface/main/dm2/model"
  6. "go-common/library/cache/redis"
  7. "go-common/library/log"
  8. )
  9. const (
  10. _prefixRecent = "dm_rct_"
  11. )
  12. func keyRecent(mid int64) string {
  13. return _prefixRecent + strconv.FormatInt(mid, 10)
  14. }
  15. // RecentDM get recent dm of up.
  16. func (d *Dao) RecentDM(c context.Context, mid, start, end int64) (dms []*model.DM, oids []int64, total int64, err error) {
  17. var (
  18. conn = d.dmRctRds.Get(c)
  19. key = keyRecent(mid)
  20. oidMap = make(map[int64]struct{})
  21. )
  22. defer conn.Close()
  23. if err = conn.Send("ZREVRANGE", key, start, end); err != nil {
  24. log.Error("conn.Send(ZREVRANGE %s) error(%s)", key, err)
  25. return
  26. }
  27. if err = conn.Send("ZCARD", key); err != nil {
  28. log.Error("conn.Send(ZCARD %s) error(%v)", key, err)
  29. return
  30. }
  31. if err = conn.Flush(); err != nil {
  32. log.Error("conn.Flush() error(%v)", err)
  33. return
  34. }
  35. values, err := redis.ByteSlices(conn.Receive())
  36. if err != nil {
  37. log.Error("conn.Receive(%s) error(%v)", key, err)
  38. return
  39. }
  40. if total, err = redis.Int64(conn.Receive()); err != nil {
  41. log.Error("conn.Receive(%s) error(%v)", key, err)
  42. return
  43. }
  44. for _, value := range values {
  45. dm := &model.DM{}
  46. if err = dm.Unmarshal(value); err != nil {
  47. log.Error("dm.Unmarshal(%s) error(%v)", value, err)
  48. return
  49. }
  50. dms = append(dms, dm)
  51. if _, ok := oidMap[dm.Oid]; !ok {
  52. oidMap[dm.Oid] = struct{}{}
  53. oids = append(oids, dm.Oid)
  54. }
  55. }
  56. return
  57. }
  58. // TrimUpRecent zrange remove recent dm of up.
  59. func (d *Dao) TrimUpRecent(c context.Context, mid, count int64) (err error) {
  60. var (
  61. conn = d.dmRctRds.Get(c)
  62. key = keyRecent(mid)
  63. )
  64. defer conn.Close()
  65. if _, err = conn.Do("ZREMRANGEBYRANK", key, 0, count-1); err != nil {
  66. log.Error("conn.Do(ZREMRANGEBYRANK %s) error(%v)", key, err)
  67. }
  68. return
  69. }