limit.go 649 B

1234567891011121314151617181920212223242526272829303132333435
  1. package model
  2. import (
  3. "context"
  4. "github.com/gogf/gf/v2/frame/g"
  5. "github.com/juju/ratelimit"
  6. "sync"
  7. "time"
  8. )
  9. var (
  10. ChatLimit = NewUserLimiter()
  11. )
  12. type UserLimiter struct {
  13. sync.Mutex
  14. limiters map[int64]*ratelimit.Bucket
  15. }
  16. func NewUserLimiter() *UserLimiter {
  17. return &UserLimiter{
  18. limiters: make(map[int64]*ratelimit.Bucket),
  19. }
  20. }
  21. func (l *UserLimiter) GetBucket(ctx context.Context, userID int64) *ratelimit.Bucket {
  22. l.Lock()
  23. defer l.Unlock()
  24. bucket, ok := l.limiters[userID]
  25. if !ok {
  26. bucket = ratelimit.NewBucket(time.Minute, g.Cfg().MustGet(ctx, "limit.rateMinute").Int64())
  27. l.limiters[userID] = bucket
  28. }
  29. return bucket
  30. }