dao.cache.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. // Code generated by $GOPATH/src/go-common/app/tool/cache/gen. DO NOT EDIT.
  2. /*
  3. Package dao is a generated cache proxy package.
  4. It is generated from:
  5. type _cache interface {
  6. // cache: -batch=10 -max_group=10 -batch_err=break -nullcache=&api.UserBase{Mid:-1} -check_null_code=$==nil||$.Mid==-1
  7. UserBase(c context.Context, mid []int64) (map[int64]*api.UserBase, error)
  8. }
  9. */
  10. package dao
  11. import (
  12. "context"
  13. "sync"
  14. "go-common/app/service/bbq/user/api"
  15. "go-common/library/stat/prom"
  16. "go-common/library/sync/errgroup"
  17. )
  18. var _ _cache
  19. // UserBase get data from cache if miss will call source method, then add to cache.
  20. func (d *Dao) UserBase(c context.Context, keys []int64) (res map[int64]*api.UserBase, err error) {
  21. if len(keys) == 0 {
  22. return
  23. }
  24. addCache := true
  25. if res, err = d.CacheUserBase(c, keys); err != nil {
  26. addCache = false
  27. res = nil
  28. err = nil
  29. }
  30. var miss []int64
  31. for _, key := range keys {
  32. if (res == nil) || (res[key] == nil) {
  33. miss = append(miss, key)
  34. }
  35. }
  36. prom.CacheHit.Add("UserBase", int64(len(keys)-len(miss)))
  37. for k, v := range res {
  38. if v == nil || v.Mid == -1 {
  39. delete(res, k)
  40. }
  41. }
  42. missLen := len(miss)
  43. if missLen == 0 {
  44. return
  45. }
  46. missData := make(map[int64]*api.UserBase, missLen)
  47. prom.CacheMiss.Add("UserBase", int64(missLen))
  48. var mutex sync.Mutex
  49. group, ctx := errgroup.WithContext(c)
  50. if missLen > 10 {
  51. group.GOMAXPROCS(10)
  52. }
  53. var run = func(ms []int64) {
  54. group.Go(func() (err error) {
  55. data, err := d.RawUserBase(ctx, ms)
  56. mutex.Lock()
  57. for k, v := range data {
  58. missData[k] = v
  59. }
  60. mutex.Unlock()
  61. return
  62. })
  63. }
  64. var (
  65. i int
  66. n = missLen / 10
  67. )
  68. for i = 0; i < n; i++ {
  69. run(miss[i*n : (i+1)*n])
  70. }
  71. if len(miss[i*n:]) > 0 {
  72. run(miss[i*n:])
  73. }
  74. err = group.Wait()
  75. if res == nil {
  76. res = make(map[int64]*api.UserBase, len(keys))
  77. }
  78. for k, v := range missData {
  79. res[k] = v
  80. }
  81. if err != nil {
  82. return
  83. }
  84. for _, key := range miss {
  85. if res[key] == nil {
  86. missData[key] = &api.UserBase{Mid: -1}
  87. }
  88. }
  89. if !addCache {
  90. return
  91. }
  92. d.cache.Do(c, func(c context.Context) {
  93. d.AddCacheUserBase(c, missData)
  94. })
  95. return
  96. }